計算機網路再次整理 tcp的關閉 七

2022-09-20 09:54:10 字數 2607 閱讀 5424

tcp的關閉不是簡單粗暴的,相對而言是友好優雅的,好聚好散吧。

那麼友好的關閉方式是這樣的:

假設這裡是客戶端請求關閉的,服務端倒過來。

客戶端:我要請求關閉

服務端:我接收到你的請求了,等我把要發的資料發完。

服務端:我要發的資料發完了,可以關閉了。

客戶端:好的,我已經執行清理工作了,關閉結束。

那麼這個時候為什麼服務端直接告訴客戶端可以直接關閉了呢?

為什麼伺服器端要做一些事情呢,到底有啥用。

回到設計的角度上,理論上是越簡單越好的,遇到了什麼問題,才使得我們要增加乙個步驟呢。

那麼就開始介紹到底傳送了什麼事情,這要從。。。。

為什麼會有四次揮手呢?

網上有很多故事哈。

下面其中乙個故事是:

答:因為當server端收到client端的syn連線請求報文後,可以直接傳送syn+ack報文。其中ack報文是用來應答的,syn報文是用來同步的。但是關閉連線時,當server端收到fin報文時,很可能並不會立即關閉socket,所以只能先回覆乙個ack報文,告訴client端,"你發的fin報文我收到了"。只有等到我server端所有的報文都傳送完了,我才能傳送fin報文,因此不能一起傳送。故需要四步握手。

下面自我整理一下。

為什麼要有揮手這個操作呢?

本質上要回到tcp是流的這種操作上。

流有什麼特點呢?就是不知道什麼時候結束。

那麼進行假如客戶端傳送資料完畢後,那麼就需要告訴服務端傳送完畢了。

服務端也需要告訴客戶端收到了客戶端的訊號了,告訴客戶端我已經知道你傳送結束了。這就兩次揮手了。

但是tcp其實是一對一的,雙向通訊的,你客戶端傳送完畢了,服務端不一定資料傳送完畢啊。

那麼客戶端應該還在接收訊息,tcp應該是半關閉了。

那麼服務端傳送資料完畢後,也應該給客戶端一次揮手,告訴客戶端:服務端已經傳送完畢了,這就3次揮手了。

客戶端應該也給服務端傳送訊號,自己收到了服務端結束資料傳輸了,你如果不給服務端傳輸,那麼服務端也不知道你訊號收到了。

那麼其實四次揮手也就是因為tcp是流的這個特性了,因為要告訴對方,流結束了,對方也要回應流結束標誌收到了。

具體實現就是下面這個了:

這裡順便說一下為什麼tcp連線要三次握手呢? 這是因為tcp是雙向通訊了。

a->b 請求連線,那麼說明a->b 是能夠通訊的。

但是b可不一定能到a,因為有防火牆等,那麼b 就要傳送資訊給 a,既是告訴b能收到b的資訊,也是試探一些b是否能傳送給a。

那麼a收到b的資料後,那麼也得回應一下啊,不然b也不知道能傳送資訊到a啊。這就三次握手了。

實驗**服務端:

// see  for more information

using system.net;

using system.net.sockets;

var socket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);

var ipaddress = ipaddress.parse("127.0.0.1");

endpoint endpoint = new ipendpoint(ipaddress, 8888);

socket.bind(endpoint);

socket.listen();

var clientsocket = socket.accept();

while (true)

else

}

實驗**客戶端:

// see  for more information

using system.net;

using system.net.sockets;

var socket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);

var ipaddress = ipaddress.parse("127.0.0.1");

endpoint endpoint = new ipendpoint(ipaddress, 8888);

socket.connect(endpoint);

socket.send(system.text.encoding.utf8.getbytes("hello service"));

console.writeline("傳送成功");

socket.shutdown(socketshutdown.send);

console.readline();

上面客戶端呼叫shutdown關閉自己的傳送端。

因為服務端不傳送訊息,直接收到客戶端的傳輸完成訊號後,直接close 雙向關閉就好。

四次揮手的抓包。

介紹網路的一些周邊之類的,比如網域名稱、網路位址套接字的一些其他選項。

計算機網路再次整理 socket 一

以前也整理過吧,寫了幾篇之後,感覺沒啥整理的必要了然後就放棄了,最近又想整理一下。這篇對應的是 可以說是這篇的重寫吧。首先介紹一下什麼是socket的,如果搞學術的不知道,他們可能要求的比較嚴,但是對於碼農來說,socket可以說是向作業系統申請網路資源。這個資源可以讓我們傳送資料和接收資料,這樣就...

計算機網路原理整理(計算機網路概述)

計算機網路是利用通訊裝置與通訊鏈路或者通訊網路,互聯位置不同 功能自治的計算機系統,並遵循一定的規則事項的計算機系統之間的資訊互動。概括 計算機網路是互聯的 自治的計算機的集合。按地理範圍 廣域網,都會網路,區域網 按傳輸介質 雙絞線,同軸電纜,光纖,無線網 按拓撲結構分 星,環,匯流排,樹,網 按...

計算機網路 TCP協議

tcp 傳送的資料單元稱為報文段。乙個 tcp 報文段分為 tcp 首部和 tcp 資料兩部分,整個 tcp 報文段作為 ip 資料報的資料部分封裝在 ip 資料報中,如圖所示 各欄位意義如下 tcp 是面向連線的協議,因此每個 tcp 連線都有三個階段 建立連線 資料傳送和連線釋放。tcp 連線的...