傳輸層 TCP 協議

2022-06-18 17:24:08 字數 2095 閱讀 2528

tcp 和 udp 處在同一層——運輸層,但是它們有很多的不同。tcp 是 tcp/ip 系列協議中最複雜的部分,它具有以下特點:

tcp 是面向位元組流的,而 tcp 傳輸資料的單元是報文段。乙個 tcp 報文段可分為兩部分:報頭和資料部分。資料部分是上層應用交付的資料,而報頭則是 tcp 功能的關鍵。

tcp 報文段的報頭有前 20 位元組的固定部分,後面 4n 位元組是根據需要而新增的字段。如圖則是 tcp 報文段結構:

20 位元組的固定部分,各欄位功能說明:

剛才說過,tcp 是面向連線的,在傳輸 tcp 報文段之前先要建立連線,發起連線的一方被稱為客戶端,而響應連線請求的一方被稱為服務端,而這個建立連線的過程被稱為三次握手

至此 tcp 連線已經建立,客戶端進入 established(已建立連線)狀態,當服務端收到確認後,也進入 established 狀態,它們之間便可以正式傳輸資料了。

當傳輸資料結束後,通訊雙方都可以釋放連線,這個釋放連線過程被稱為釋放連線:

注意此時連線還沒有釋放,需要時間等待狀態結束後(4 分鐘) 連線兩端才會 closed。設定時間等待是因為,有可能最後乙個確認報文丟失而需要重傳。

可見超時重發機制是 tcp 可靠性的關鍵,只要沒有得到確認報文段,就重新傳送資料報,直到收到對方的確認為止。

tcp 規定,接收者收到資料報文段後,需回覆乙個確認報文段,以告知傳送者資料已經收到。而傳送者如果一段時間內(超時計時器)沒有收到確認報文段,便重**送:

為了實現超時間重傳,需要注意:

也許你也發現了,按上面的介紹,超時重傳機制很費時間,每傳送乙個資料報都要等待確認。

在實際應用中的確不是這樣的,真實情況是,採用了流水線傳輸:傳送方可以連續傳送多個報文段(連續傳送的資料長度叫做視窗),而不必每發完一段就停下來等待確認。

實際應用中,接收方也不必對收到的每個報文都做回覆,而是採用累積確認方式:接收者收到多個連續的報文段後,只回覆確認最後乙個報文段,表示在這之前的資料都已收到。

這樣,傳輸效率得到了很大的提公升。

由於接收方快取的限制,傳送視窗不能大於接收方接收視窗。在報文段首部有乙個欄位就叫做視窗(rwnd),這便是用於告訴對方自己的接收視窗,可見視窗的大小是可以變化的。

那麼視窗的大小是如何變化的呢?tcp 對於擁塞的控制總結為「慢啟動、加性增、乘性減」,如圖所示:

cd desktop

git clone

cd tcp_ip_6

gcc -o server server.c

gcc -o client client.c

編譯完成後先不要執行,先開啟 tcpdump,使用命令安裝並執行 tcpdump:

sudo apt-get update

sudo apt-get install tcpdump

sudo tcpdump -vvv -x -i lo tcp port 7777

最小化執行 tcpdump 的終端,然後另開乙個終端,執行 server 程式:

cd desktop/tcp_ip_6

./server 127.0.0.1

然後再開啟第三個終端,執行 client 程式:

cd desktop/tcp_ip_6

./client 127.0.0.1

現在,使用 client 和 server 聊天,輪流互發幾條簡短的訊息(比如 hello、hi、wei 之類的)便可以關閉 client 和 server,回到執行 tcpdump 的終端檢視抓取的報文段內容:

通過抓取的報文,還可以清晰的看到建立連線三次握手和斷開連線四次握手的過程。

1、按實驗步驟,使用 tcpdump 抓取 tcp 報文段,觀察三次握手建立連線和四次握手釋放連線的過程,並截圖。

2、使用實驗給出的聊天程式收發訊息,用 tcpdump 抓取包含聊天內容的 tcp 報文段,解讀聊天內容,並截圖。

傳輸層 TCP協議

1 序號 在乙個tcp連線中傳送的位元組流中的每乙個位元組都按順序編號,本欄位表示本報文段所傳送資料的第乙個位元組的序號。2 確認號 期望收到對方下乙個報文段的第乙個資料位元組的序號。若確認號為n,則證明到序號n 1為止的所有資料都已正確收到。即採用累計確認 3 資料偏移 首部長度 tcp 報文段的...

傳輸層TCP協議

面向連線,可靠傳輸,面向位元組流 tcp協議 面向連線 accept 獲取新連線 1.當呼叫accept之後,核心就會為新連線建立乙個套接字描述符,服務端使用該套接字描述符進行和客戶端進行資料通訊 2.連線建立之後,雙方都可以傳送資料 確認msg1 確認的行為是傳輸層tcp協議的行為,不是應用層的行...

傳輸層協議TCP

部分埠號 第二次握手 伺服器應用程序被動開啟。若同意客戶端的請求,則發回確認報文,其首部中 syn 1,ack 1,ack x 1,seq y。第三次握手 客戶端收到確認報文之後,通知上層應用程序連線已建立,並向伺服器發出確認報文,其首部 ack 1,ack y 1。當伺服器收到客戶端的確認報文之後...