TCP提供一種面向連接的、可靠的字節流服務。
TCP將用戶數據打包構成報文段;它發送數據後啓動一個定時器;另一端對收到的數據進行確認,對失序的數據重新排序,丟棄重複數據;TCP提供端到端的流量控制,並計算和驗證一個強制性的端到端檢驗和
TCP首部
- TCP爲應用層提供全雙工服務,因此,數據能在兩個方向上獨立地傳輸。連接的每一段都必須保持每個方向上的傳輸數據序號。
- 首部長度: 多少個32bit的數目, 因此,4位首部長度標識了TCP首部最多(2<<4 - 1) * 4B = 60B。沒有選項的話,長度是20字節。
-
- URG 緊急指針
- ACK 確認序號有效
- PSH 接收方要儘快交報文給應用層
- RST 重建連接
- 同步序號,用來發起一個連接。
- FIN 發送端完成發送任務。
TCP連接的建立和終止
curl baidu.com
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:28:24.750037 IP own.38186 > 123.125.115.110.http: Flags [S], seq 2832499680, win 14600, options [mss 1460,sackOK,TS val 1537447629 ecr 0,nop,wscale 6], length 0
14:28:24.791235 IP 123.125.115.110.http > own.38186: Flags [S.], seq 1751808781, ack 2832499681, win 8192, options [mss 1452,sackOK,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,wscale 5], length 0
14:28:24.791286 IP own.38186 > 123.125.115.110.http: Flags [.], ack 1, win 229, length 0
14:28:24.791687 IP own.38186 > 123.125.115.110.http: Flags [P.], seq 1:163, ack 1, win 229, length 162
14:28:24.836821 IP 123.125.115.110.http > own.38186: Flags [.], ack 163, win 808, length 0
14:28:24.836866 IP 123.125.115.110.http > own.38186: Flags [P.], seq 1:306, ack 163, win 808, length 305
14:28:24.836876 IP own.38186 > 123.125.115.110.http: Flags [.], ack 306, win 245, length 0
14:28:24.836883 IP 123.125.115.110.http > own.38186: Flags [P.], seq 306:387, ack 163, win 808, length 81
14:28:24.836889 IP own.38186 > 123.125.115.110.http: Flags [.], ack 387, win 245, length 0
14:28:24.837176 IP own.38186 > 123.125.115.110.http: Flags [F.], seq 163, ack 387, win 245, length 0
14:28:24.880084 IP 123.125.115.110.http > own.38186: Flags [.], ack 164, win 808, length 0
14:28:24.880115 IP 123.125.115.110.http > own.38186: Flags [F.], seq 387, ack 164, win 808, length 0
14:28:24.880133 IP own.38186 > 123.125.115.110.http: Flags [.], ack 388, win 245, length 0
14:28:27.920615 IP 123.125.115.110.http > own.38186: Flags [R], seq 1751809169, win 0, length 0
過程如圖:
終止協議, 4次握手
TCP全雙工,所以,每個方向必須單獨地關閉。
最大報文長度
- MMS, 建立連接時,互相告知自己的MSS. 例子中的
[mss 1460,sackOK,TS val 1537447629 ecr 0,nop,wscale 6]
, MMS爲1460 - MMS選項只能在SYN報文段中出現。
- MMS值可以設置爲MTU減去固定的IP首部、TCP首部長度。
- 限制另一端發送數據報的長度。使用較小的MTU。
TCP半關閉
爲了數據傳輸完成
TCP狀態遷移圖
MSL
MSL 報文最大生存時間(Maximum segment lifetime)
TIME_WAIT狀態也稱爲 2MSL等待狀態。
TCP選項
時延確認, 時延必須小於500
Nagle算法, 每次只能有一個未確認的報文段。
滑動窗口協議
該協議允許發送方在停止並等待確認前可以連續發送多個分組。
發送方不必每發一個分組就停下來等待確認, 因此,可以加速數據的傳輸。
滑動窗口例子:
停止等待協議
滑動窗口大小爲1,信道中每次只能有一個分組或是一個確認。
序號和確認號:
確認號總是聲明接收方預期接收的下一個分組序號。如0號分組已經安全到達, 接收方發送一個確認號爲1的ACK
發送窗口
三個變量定義了窗口的大小和位置。Sf(未完成的分組),Sn(下一個待發送分組),S(size, 大小)
差錯控制
- 校驗和
- 確認
- 選擇性確認
- 重傳。
擁塞控制
cwnd 擁塞窗口
TCP發送方使用一種反饋從另一端檢測擁塞: ACK。
- 沒有週期性的及時的接收到ACK,則是嚴重擁塞
- 接到三次重複的ACK,是輕微擁塞。
處理擁塞的方法:慢啓動,擁塞避免和快速恢復。
慢啓動:
指數增加:
- cwnd = 1
- 1 + 1 = 2
- 2 + 2 = 4
通過觀察到新分組進入網絡的速率應該與另一端返回確認的速率相同而進行工作。
慢啓動,指數級增長。
擁塞避免
加性增加
- cwnd = i
- cwnd = i+1
- cwnd = i+2
快速恢復
cwnd = cwnd + (1/cwnd)
流量控制
接收方TCP控制發送方TCP, 發送方TCP控制發送方進程。反向控制。
TCP堅持定時器
意義
一個ACK丟失,發送方和接收方可能因爲等待對方而使連接終止:接收方等待接受數據, 發送方等待允許它繼續發送數據的窗口更新。
爲了防止出現這種死鎖情況, 發送方使用一個堅持定時器,週期性的向接收方查詢窗口,以便發現窗口是否增大。
報文段稱爲窗口探查。