TCP解析

TCP傳輸控制協議

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議
tcp是一個可靠的協議,也就是說,除非網絡出現問題,數據將被完好的按原樣正確的傳送到另外一端,其可靠性主要通過以下的規則實現。

1.防止數據篡改方面

爲了防止數據在傳輸過程中被損壞,每個信息包都包含了一個==校驗碼==,這個校驗碼就是一個用來保證信息包在傳輸過程中沒有被更改的代碼。當信息包到達目的地的時候,接收方會比較校驗碼和收到的信息中的數據。如果校驗碼不對,則該信息包將被省略。

3.防止信息包丟失方面

爲了防止信息報包丟失,tcp會要求接收方每收到一個信息包都反饋一下。如果接收方沒有提供反饋,發送發會自動重發一次。tcp會一直試着放鬆信息包,一直到接受者收到爲止,或者他會判斷出網絡連接斷了,並在程序返回一個錯誤提示。

4.在信息包重複或順序錯誤方面

爲了防止信息包重複或者順序錯誤,tcp每傳送一個信息包都會傳送一個序號,接收方會檢查這個序號,確保收到該信息包,並把全部信息包按照順序重新合併,同時,如果接收方看到了一個已經看過的序號,則該信息包就會被丟棄。

5.tcp全雙工

TCP連接是全雙工的,就是使用了兩條通信的線路,所以在關閉的時候,通信雙方都進行單獨的關閉連接。

6.tcp連接的三次握手

image
來回共三次握手,完成連接。

7.tcp斷開的四次揮手

image

問題

1.爲什麼建立連接協議是三次握手,而關閉連接卻是四次握手呢?

這是因爲服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文裏來發送。但關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要發送一些數據給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這裏的ACK報文和FIN報文多數情況下都是分開發送的.
簡單的說就是,連接的時候只要接收到同意就連接。斷開的話不是這樣,對方同意了也關閉了發數據到我方的線路,但因爲tcp是==全雙工==的。即接收方方還可以收到數據,發送發可能還有一些數據沒發完。發完後再發一個ack斷開和對方的連接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章