2.1 TCP鏈接的創建與終止
-
TCP鏈接的組成:一對端點或則套接字組成(兩個IP地址和端口)服務器
-
鏈接的階段:啓動,數據傳輸(鏈接創建),和退出markdown
-
TCP鏈接的創建cookie
- 主動開啓者(客戶端)發送一個SYN報文段,並指明本身要鏈接的端口號和他的客戶端初始序列號(ISN(c))
- 服務器也發送本身的SYN報文段做爲響應,包含了服務器的初始序列號(ISN(s)).爲了確認客戶端的SYN,服務器將其包含的ISN(c)數據加1做爲返回的ACK數值.每發送一個SYN,序列號碼就會加1.若是丟包,該SYN就會重傳.
- 爲了確認服務器的SYN,客戶端將ISN(s)的數值加1做爲返回的ACK值.
經過上述3個報文段可以完成一個TCP鏈接的創建,一般稱爲三次握手.三次握手的目的不只讓通訊雙方瞭解一個鏈接的創建,還能夠利用數據包的選項來承擔特殊的信息,交換序列號.網絡
首次發送SYN的一方被認爲是主動打開一個鏈接,一般是一個客戶端.鏈接的另一個會接受這個SYN,併發送下一個SYN,所以被稱做被動的打開一個鏈接.一般是稱爲服務器.併發
-
TCP鏈接的關閉(發送一個FIN報文段)函數
- 鏈接的主動關閉者發送一個FIN段申明本身的序列號(K).FIN段包含了一個ACK段用於確認最近一次的發來的數據.
- 鏈接的被動關閉者將K的數值加1做爲響應的ACK值,代表本身已經成功接收到了主動關閉者發送的FIN.同時上層的應用程序會被告知鏈接的另一端已經提出了關閉的請求.應用程序發起本身的關閉操做.接着,被動關閉者將身份轉換成主動關閉者,發送本身的FIN.
- 爲了完成鏈接的關閉,最後的發送的報文段還包含一個ACK用於確認上一個FIN值.注意的是,若是出現FIN丟失的狀況,那麼發送方將從新傳輸直到接受到一個ACK確認爲止.
* 測試
2.2 TCP選項
2.3 TCP狀態轉換
2.3.1 TCP狀態轉換圖
* 編碼
- SYN_SENT:客戶端在發送請求以後等待匹配的鏈接請求,經過connect()函數向服務器發出一個同步(SYN)信號後進入此狀態
- LISTEN:服務器等從任意遠程TCP端口的鏈接請求
- SYN_RECEIVED:服務器已經收到併發出同步(SYN)信號以後等待確認(ACK)請求
- ESTABLISHED:服務器與客戶端的鏈接已經打開,收到的數據能夠發送給用戶.數據傳輸步驟正常狀況.此時鏈接的兩端的平等的.這時稱爲全鏈接
- FIN_WAIT1:客戶端或則服務端主動關閉調用close()函數發出FIN包,表示本方的數據所有結束等待TCP鏈接另外一端的ACK確認包或FIN&ACK請求包
- FIN_WAIT_2:主動關閉在FIN_WAIT_1狀態下收到的ACK確認包,進入等待遠程TCP的鏈接終止請求的半關閉狀態,這時能夠接受數據,但不發送數據
- CLOSE_WAIT:被動關閉端接到FIN後,接發出ACK以迴應FIN請求,並進入等待本地用戶的鏈接終止請求的半關閉狀態.這時能夠發送數據,但再也不接受數據
- CLOSING:在發出FIN後,又收到對方發來的FIN後,進入等待對方對方對己方的鏈接終止(FIN)確認(ACK)的狀態.
- LAST_ACK:被動關閉端所有數據發出完成以後,向主送關閉端發送FIN,進入等待確認包的狀態
- TIME_WAIT:主動關閉端接受到FIN後,接發出ACK包,等待足夠的時間以確保被動關閉端收到了終止請求的確認包.
- CLOSED:徹底沒有鏈接
TIME_WAIT狀態也稱爲2MSL等待狀態.TCP將會等待兩倍於最大段生存期(Maximum Segment Lifetime,MSL)的時間,有時也稱做加倍等待spa
2.4 與TCP鏈接管理相關的攻擊
SYN泛洪是一種拒絕服務攻擊,一個或則多個客戶端產生一系列TCP鏈接嘗試(SYN報文段),並將它們發給一條服務器,一般採用僞造的源IP地址.服務器會爲每一條鏈接分配必定數量的鏈接資源.因爲鏈接還沒有徹底創建,服務器爲了維護大量的半打開的鏈接會會耗盡自身的內存,而後拒絕後續合法的鏈接請求.3d
- 預防機制:SYN cookies
- 思想:接收到一個SYN時,這條鏈接存儲的大部分信息會被編碼並保存在SYN + ACK報文段的序列號字段.採用SYN cookies 的目標主機不須要爲進入的鏈接請求分配任何存儲資源----只有當SYN + ACK 報文段自己被確認後(而且返回初始序列後)纔會分配真正的內存.
2.5 TCP的應用
實時應用並不須要甚至沒法忍受TCP的可靠傳輸機制。在這種類型的應用中,一般容許一些丟包、出錯或擁塞,而不是去校訂它們。例如一般不使用TCP的應用有:流媒體、網絡遊戲、IP電話(VoIP)等等。任何不是很須要可靠性或者是想將功能減到最少的應用能夠避免使用TCP。在不少狀況下,當只須要多路複用應用服務時,用戶數據報協議(UDP)能夠代替TCP爲應用提供服務。