經過以下命令讓主機svr4與bsdi發起並終止鏈接服務器
下面爲tcpdump輸出的TCP報文段部分socket
每行格式爲源>目的:標誌
tcp
上圖中的標誌的解釋大數據
三次握手:線程
1415531521+1=1415531522
。一個SYN佔用一個序號1823083521+1=1823083522
一個TCP鏈接是全雙工,數據在兩個方向傳遞,所以若是要關閉TCP鏈接,必須單獨關閉兩個方向的鏈接設計
四次握手:3d
之因此比鏈接多一次握手,是由於TCP支持半關閉,容許一邊關閉鏈接後另外一邊仍能發送數據,因此沒法合併報文5和報文6,二者之間仍然可能存在單向數據傳輸的報文。因此一旦使用了半關閉,這四次握手就會分紅兩個階段執行code
其中第一、2次請求間隔5.8秒,第二、3次請求間隔24秒,其中tos 0x10表明telnet將IP數據報服務類型字段設爲最小時延orm
上面顯示的總耗時76秒,是由於在大多數實現中,新建鏈接的時間最長爲75秒server
BSD TCP採用500ms定時器,在初始化設置時,第一個500ms內會在任意時刻滴答一下,致使第一個間隔不是6秒而是5.8秒,但第二個間隔倒是準確的24秒
MSS,表示TCP傳往另外一端最大數據塊的長度。當創建TCP鏈接時,雙方都要通告各自的MSS。如當A告知B MSS爲1460時,表示B能夠發給A的最大數據塊長度就是1460
一般以太網將MSS設爲MTU大小減去IP首部和TCP首部長度,即1500-20-20=1460
TCP提供了發送端在結束髮送後,依然能夠接收數據的能力,這就是半關閉
在應用程序調用shutdown,而且第二個參數爲1時,會使用半關閉。普通的close不會有半關閉。因此不多應用程序會使用到半關閉
爲何要有半關閉?
場景:當發送遠程命令到目的主機執行時,命令發送完後,client就能結束數據發送,但仍然接收目的主機發回的執行結果,這就是半關閉狀態,當目的主機發完數據時,結束數據發送,完成鏈接關閉。沒有半關閉,目的主機沒法知道client數據何時發完,也就沒法執行命令並響應結果
其中SYN收到就是SYN_RCVD
經過上面兩個圖能夠觀察到
並不存在CLOSED這個狀態,它是一個假象的狀態起點和終點,因此server從CLOSED過分到LISTEN不須要特殊處理
又稱2MSL等待狀態,即2倍的報文段最大生存週期
當TCP主動關閉一方發送最後一個ACK時,會進入TIME_WAIT狀態,等待2MSL時間才能完全關閉鏈接
爲何須要等待2MSL呢?
2MSL=MSL(丟失的ACK)+MSL(重發的FIN)
)大部分TCP實現較爲嚴格,在TIME_WAIT期間,沒法複用端口
當主動關閉一方發送FIN,並收到ACK後,會進入FIN_WAIT_2狀態,直到被動關閉一方發送FIN,主動方纔會響應ACK並進入TIME_WAIT狀態
因此,若是被動關閉一方不關閉鏈接,會致使主動關閉一方永遠處於FIN_WAIT_2狀態,而被動關閉一方永遠處於CLOSE_WAIT狀態
當報文段發往一個socket時出現錯誤,TCP就會發出一個復位報文段。一般有如下三種場景:
如圖顯示了三個選項:
實際爲了保證選項總長度是4字節的倍數,須要在其中填充無操做NOP選項
服務器能夠限定本地監聽的IP地址和遠端請求的IP地址
當服務器忙於處理客戶端請求時,多的請求在鏈接創建後會放入鏈接隊列。鏈接隊列有如下規則: