TCP/IP詳解
網(wǎng)絡協(xié)議通常分不同層次進行開發(fā),每一層分別負責不同的通信功能
一個協(xié)議族,比如TCP/IP,是一組不同層次上多個協(xié)議的組合
TCP/IP通常被認為是一個四層組織協(xié)議
TCP/IP
- 鏈路層,有時也稱作數(shù)據(jù)鏈路層和網(wǎng)絡接口層,通常包括操作系統(tǒng)中的設備驅(qū)動程序和計算機中對應的網(wǎng)絡接口卡
- 網(wǎng)絡層,有時也稱作互聯(lián)網(wǎng)層,處理分組在網(wǎng)絡中的活動。在TCP/IP協(xié)議族中,網(wǎng)絡層協(xié)議包括IP協(xié)議(網(wǎng)際協(xié)議),ICMP協(xié)議(Internet互聯(lián)網(wǎng)控制報文協(xié)議),IGMP協(xié)議(Internet組管理協(xié)議)
- 運輸層主要為兩臺主機上的應用程序提供端到端的通信。TCP和UDP
應用層負責處理特定的應用程序細節(jié)
TCP/IP
TCP:傳輸控制協(xié)議
TCP提供一種面向連接的、可靠地字節(jié)流服務
TCP通過下列方式來提供可靠性
- 應用數(shù)據(jù)被分割成TCP認為最適合發(fā)送的數(shù)據(jù)塊
- 自適應的超時及重傳
- 當TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個確認(這個確認通常會推遲幾分之一秒)
- TCP將保持它首部和數(shù)據(jù)的檢驗和
- TCP報文段是作為IP數(shù)據(jù)包來傳輸?shù)模虼说竭_可能會失序。如果必要,TCP將對收到的數(shù)據(jù)進行重新排序
- 接收端丟棄重復的數(shù)據(jù)
- 提供流量控制
TCP的首部
TCP數(shù)據(jù)被封裝在一個IP數(shù)據(jù)報中
IP數(shù)據(jù)報
TCP首部的數(shù)據(jù)格式。如果不計任何字段,它通常是20個字節(jié)
首部數(shù)據(jù)格式
一個IP地址和一個端口號也稱為一個socket,socket pair可唯一確定互聯(lián)網(wǎng)絡中每個TCP連接的雙方。
序號用來標識從TCP發(fā)端向TCP收端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個報文段中的第一個數(shù)據(jù)字節(jié)。
當建立一個新的連接時,SYN標志變?yōu)?。
- URG 緊急指針有效
- ACK 確認序號有效
- PSH 接收方應該盡快將這個報文段交給應用層
- RST 重建連接
- SYN 同步序號用來發(fā)起一個連接
- FIN 發(fā)端完成發(fā)送任務
TCP連接的建立和終止
三次握手
1 請求短發(fā)送一個SYN段指明客戶打算連接的服務器端口,以及初始序號(ISN)
2 服務器發(fā)回包含服務器的初始序號的SYN報文段作為應答。同時,將確認序號設置為客戶的ISN+1以對客戶的SYN報文段進行確認。一個SYN將占用一個序號
3 客戶必須將確認序號設置為服務器的ISN+1以對服務器的SYN報文段進行確認
三次握手
連接終止
1 進行關(guān)閉的一方發(fā)送第一個FIN
2 服務器收到FIN,發(fā)回一個ACK,確認序號為收到的序號+1。和SYN一樣,一個FIN將占用一個序號。
3 同時TCP服務器還向應用程序傳送一個文件結(jié)束符。接著這個服務器就關(guān)閉它的連接,導致它的TCP端發(fā)送一個FIN。
4 客戶必須發(fā)回一個FIN,并將確認序號設置為收到序號+1。
最大報文長度
最大報文長度(MSS)表示TCP傳往另一端的最大數(shù)據(jù)塊的長度。
MSS讓主機限制另一端發(fā)送數(shù)據(jù)報的長度。加上主機也能控制它發(fā)送數(shù)據(jù)報的長度,這將使以較小MTU連接到一個網(wǎng)絡上的主機避免分段。
TCP的半關(guān)閉
TCP提供了連接的一端在結(jié)束它的發(fā)送后還能接收來自另一端數(shù)據(jù)的能力,這就是所謂的半關(guān)閉。
TCP的狀態(tài)變遷圖

2MSL等待狀態(tài)
TIME_WAIT狀態(tài)也稱為2MSL等待狀態(tài)。
對一個具體實現(xiàn)所給定的MSL值,處理的原則是:當TCP執(zhí)行一個主動關(guān)閉,并發(fā)回最后一個ACK,該連接必須在TIME_WAIT狀態(tài)停留的時間為2倍的MSL。
這種2MSL等待的另一個結(jié)果是這個TCP連接在2MSL等待期間,定義這個連接的插口不能再被使用。這個連接只能在2MSL結(jié)束后才能再被使用。
平靜時間的概念
TCP在重啟后的MSL秒內(nèi)不能建立任何連接
FIN_WAIT_2
只有當另一端的進程完成這個關(guān)閉,我們這端才會從FIN_WAIT_2狀態(tài)進入TIME_WAIT狀態(tài)。
復位報文段
TCP首部中的RST是用于復位的。一般來說,無論何時一個報文段發(fā)往基準的連接出現(xiàn)錯誤,TCP都會發(fā)出一個復位報文段。
- 到不存在的端口的連接請求
- 異常終止一個連接
- 檢測版打開連接
TCP的成塊數(shù)據(jù)流
TCP使用滑動窗口協(xié)議來進行流量控制。該協(xié)議允許發(fā)送方在停止并等待確認前可以連續(xù)發(fā)送多個分組。由于發(fā)送方不必每發(fā)一個分組就停下來等待確認,因此該協(xié)議可以加速數(shù)據(jù)的傳輸。
數(shù)據(jù)塊傳輸
1 發(fā)送方不必發(fā)送一個全窗口大小的數(shù)據(jù)
2 來自接收方的一個報文段確認數(shù)據(jù)并把窗口向右滑動。因為窗口的大小是相對于確認序號的。
3 窗口的大小可以減小,但是窗口的右邊沿卻不能向左滑動。
4 接受方在發(fā)送一個ACK前不必等待窗口被填滿。
滑動窗口
PUSH標志
使用API通知TCP設置正在接收數(shù)據(jù)的PUSH標志或得到該數(shù)據(jù)是否被設置PUSH標志的信息是不可能的。
慢啟動
慢啟動為發(fā)送方的TCP增加了一個窗口:擁塞窗口,記為cwnd。
當與另一個網(wǎng)絡的主機建立TCP連接時,擁塞窗口被初始化為1個報文段。沒收到一個ACK,擁塞窗口就增加一個報文段。
發(fā)送方取擁塞窗口與通告窗口中的最小值作為發(fā)送上限。
擁塞窗口是發(fā)送方使用的流量控制,而通告窗口則是接收方使用的流量控制。
寬帶時延乘積
通道容量: capatity(bit)=bandwidth(b/s)*round-trip time(s)
擁塞
當數(shù)據(jù)到達一個大的管道并向一個較小的管道發(fā)送時
當多個輸入流到達一個路由器,而路由器的輸出流小于這些輸入流的總和時
TCP的超時與重傳
TCP通過在發(fā)送時設置一個定時器來解決數(shù)據(jù)和確認丟失的問題。如果當定時器溢出時還沒有收到確認,它就重傳該數(shù)據(jù)。
對每個連接,TCP管理4個不同的定時器:
1 重傳定時器使用于當希望收到另一端的確認。
2 堅持(persist)定時器使窗口大小信息保持不斷流動,即使另一端關(guān)閉了其接收窗口。
3 ?;睿╧eepalive)定時器可以檢測到一個空閑連接的另一端何時崩潰或重啟。
4 2MSL定時器測量一個連接處于TIME_WAIT狀態(tài)的時間。
往返時間(RTT)
$$ R\leftarrow \alpha R+\left( 1-d\right)M $$
$$ Err=M-A $$
$$ A\leftarrow A+gErr $$
$$ D\leftarrow D+h\left(|Err| -D\right) $$
$$ RTO = A+4D $$
M表示測量得到的RTT
\(\alpha\)是一個推薦值為0.9的平滑因子
A是被平滑的RTT
D是被平滑的均值方差
Err是剛得到的測量結(jié)果與當前的RTT估計器之差
增量g起平均作用,取為0.125
偏差的增益是h,取值為0.25具體計算實例參考TCP-IP詳解卷一第21章
TCP的堅持定時器
ACK的傳輸并不可靠,TCP不對ACK報文段進行確認,TCP只確認那些包含有數(shù)據(jù)的ACK報文段。
如果一個確認丟失了,則雙方就有可能因為等待對方而是連接終止:接收方等待接收數(shù)據(jù),而發(fā)送方在等待允許它繼續(xù)發(fā)送數(shù)據(jù)的窗口更新。為防止這種死鎖情況的發(fā)生,發(fā)送方使用一個堅持定時器來周期性的向接收方查詢,以便發(fā)現(xiàn)窗口是否已增大。這些從發(fā)送方發(fā)出的報文段稱為窗口探查。
TCP的?;疃〞r器
如果一個給定的連接在兩個小時之內(nèi)沒有任何動作,則服務器就向客戶發(fā)送一個探查報文段??蛻糁鳈C必須處于以下4個狀態(tài)之一:
1 客戶主機依然正常運行,并從服務器可達??蛻舻腡CP響應正常,而服務器也知道對方是正常工作的。服務器在2個小時以后將?;疃〞r器復位。如果在兩個小時定時器到時間之前有應用程序的通信量通過此連接,則定時器在交換數(shù)據(jù)后的未來2小時再復位
2 客戶主機已經(jīng)崩潰,并且關(guān)閉或者常在重啟。在任何一種情況下,客戶的TCP都沒有響應。服務器將不能夠收到對方的探查,并在75秒后超時。服務器總共發(fā)送10個這樣的探查,每個間隔75秒。如果服務器沒有收到一個響應,它就認為客戶主機已經(jīng)關(guān)閉并終止連接。
3 客戶主機崩潰并已經(jīng)重新啟動。這時服務器將收到一個對其?;钐讲榈捻憫沁@個響應是一個復位,使得服務器終止這個連接。
4 客戶主機正常運行,但是服務器不可達。與狀態(tài)2相同






