TCP和UDP都處在網絡模型的傳輸層,並且都使用相同的網絡層,TCP提供一種面向連接的、可靠的字節流服務。
TCP通過下列方式來提供可靠性:
- 應用數據被分割成TCP認爲最適合發送的數據塊,由TCP傳遞給IP的信息單位稱爲報文段或者段,對於段的長度,是由一些策略決定的,和應用層相關。
- 當TCP發出一個段後,它啓動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。TCP協議中有自適應的超時及重傳策略。
- 當TCP收到發自TCP連接另一端的數據,它將發送一個確認。這個確認不是立即發送,而是推遲幾分之一秒。
- TCP將保持它首部和數據的檢驗和,如果出現差錯,就會期望發送方重新發送。
- 如果有必要,TCP將對收到的數據進行重新排序,確保收到的數據以正常的順序交給應用層。
- 可以丟棄被認爲重複的數據。
- TCP還提供流量控制。TCP連接的每一方都有固定大小的緩衝空間。TCP的接收端只允許另一端發送接收端緩衝區所能接納的數據。
在傳輸過程中,TCP對字節流的內容不作任何解釋。
一,TCP的首部佈局
TCP數據被封裝在一個IP數據報中,封裝如下所示 :
TCP首部的數據格式,如果不計任選字段,TCP首部大小爲20個字節,其佈局如下圖所示:
二,端口號
每個TCP段都包含源端和目的端的端口號,這可以用於尋找發送端和接收端的應用進程,我們在服務器上的網絡應用程序,往往都會指定一個監聽端口,其實在客戶端連接成功之後,客戶端操作系統會自動的爲TCP連接分配一個端口,用於和服務器端通訊。這兩個端口加上IP首部中的源端IP和目的端IP地址唯一確定一個TCP連接。其實一個端口和一個IP能夠唯一的標識一個socket。
三,序號
序號用來標識從TCP發送端向TCP接收端發送的數據字節流,TCP用序號對每個字節進行計數。
四,確認序號
確認序號包含發送確認的一端所期望收到的下一個序號,因此,確認序號是上次已經成功收到數據字節序號加1。
五,首部長度
4 位的首部長度給出首部中32bit字(4 個字節)的數目,需要這個值是因爲選項字段的長度是可變的,因爲這個字段佔4個位,所以TCP最多有15*4=60個字節,在沒有選項的時候,長度是20字節。
六,標誌比特
6個標誌比特:
- URG。此時16位的緊急指針有效。
- ACK。確認序號有效。
- PSH。接收方應該儘快將這個報文段交給應用層。
- RST。重建連接。
- SYN。同步序號用來發起一個連接。
- FIN。發送端完成發送任務。
七,檢驗和
檢驗和覆蓋了整個的TCP報文段:TCP首部和TCP數據。這個字段一定是由發送端計算和存儲,並由接收端進行驗證。
八,關於選項
最常見的可選字段是最長報文大小,也就是MSS,每個連接方通常都在通信的第一個報文段凡是SYN標誌發送的時候,將MSS通告對方。