最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

網(wǎng)絡(luò)編程懶人入門(十四):到底什么是Socket?一文即懂!

2022-02-16 13:05 作者:nickkckckck  | 我要投稿

本文由cxuan分享,原題“原來這才是 Socket”,有修訂。

1、引言

本系列文章前面那些主要講解的是計(jì)算機(jī)網(wǎng)絡(luò)的理論基礎(chǔ),但對(duì)于即時(shí)通訊IM這方面的應(yīng)用層開發(fā)者來說,跟計(jì)算機(jī)網(wǎng)絡(luò)打道的其實(shí)是各種API接口。

本篇文章就來聊一下網(wǎng)絡(luò)應(yīng)用程序員最熟悉的Socket這個(gè)東西,拋開生澀的計(jì)算機(jī)網(wǎng)絡(luò)理論,從應(yīng)用層的角度來理解到底什么是Socket。

對(duì)于 Socket 的認(rèn)識(shí),本文將從以下幾個(gè)方面著手介紹:

  • 1)Socket 是什么;

  • 2)Socket 是如何創(chuàng)建的;

  • 3)Socket 是如何連接的;

  • 4)Socket 是如何收發(fā)數(shù)據(jù)的;

  • 5)Socket 是如何斷開連接的;

  • 6)Socket 套接字的刪除等。

特別說明:本文中提到的“Socket”、“網(wǎng)絡(luò)套接字”、“套接字”,如無特殊指明,指的都是同一個(gè)東西哦。

?

學(xué)習(xí)交流:

- 移動(dòng)端IM開發(fā)入門文章:《新手入門一篇就夠:從零開發(fā)移動(dòng)端IM》

- 開源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK?

(本文已同步發(fā)布于:http://www.52im.net/thread-3821-1-1.html)

2、Socket 是什么

一個(gè)數(shù)據(jù)包經(jīng)由應(yīng)用程序產(chǎn)生,進(jìn)入到協(xié)議棧中進(jìn)行各種報(bào)文頭的包裝,然后操作系統(tǒng)調(diào)用網(wǎng)卡驅(qū)動(dòng)程序指揮硬件,把數(shù)據(jù)發(fā)送到對(duì)端主機(jī)。

整個(gè)過程的大體的圖示如下:

我們大家知道,協(xié)議棧其實(shí)是位于操作系統(tǒng)中的一些協(xié)議的堆疊,這些協(xié)議包括 TCP、UDP、ARP、ICMP、IP等。

通常某個(gè)協(xié)議的設(shè)計(jì)都是為了解決特定問題的,比如:

  • 1)TCP 的設(shè)計(jì)就負(fù)責(zé)安全可靠的傳輸數(shù)據(jù);

  • 2)UDP 設(shè)計(jì)就是報(bào)文小,傳輸效率高;

  • 3)ARP 的設(shè)計(jì)是能夠通過 IP 地址查詢物理(Mac)地址;

  • 4)ICMP 的設(shè)計(jì)目的是返回錯(cuò)誤報(bào)文給主機(jī);

  • 5)IP 設(shè)計(jì)的目的是為了實(shí)現(xiàn)大規(guī)模主機(jī)的互聯(lián)互通。

應(yīng)用程序比如瀏覽器、電子郵件、文件傳輸服務(wù)器等產(chǎn)生的數(shù)據(jù),會(huì)通過傳輸層協(xié)議進(jìn)行傳輸。而應(yīng)用程序是不會(huì)和傳輸層直接建立聯(lián)系的,而是有一個(gè)能夠連接應(yīng)用層和傳輸層之間的套件,這個(gè)套件就是?Socket。

在上面這幅圖中,應(yīng)用程序包含 Socket 和解析器,解析器的作用就是向 DNS 服務(wù)器發(fā)起查詢,查詢目標(biāo) IP 地址(關(guān)于DNS請(qǐng)見《理論聯(lián)系實(shí)際,全方位深入理解DNS》)。

應(yīng)用程序的下面:就是操作系統(tǒng)內(nèi)部,操作系統(tǒng)內(nèi)部包括協(xié)議棧,協(xié)議棧是一系列協(xié)議的堆疊。

操作系統(tǒng)下面:就是網(wǎng)卡驅(qū)動(dòng)程序,網(wǎng)卡驅(qū)動(dòng)程序負(fù)責(zé)控制網(wǎng)卡硬件,驅(qū)動(dòng)程序驅(qū)動(dòng)網(wǎng)卡硬件完成收發(fā)工作。

在操作系統(tǒng)內(nèi)部有一塊用于存放控制信息的存儲(chǔ)空間,這塊存儲(chǔ)空間記錄了用于控制通信的控制信息。其實(shí)這些控制信息就是 Socket 的實(shí)體,或者說存放控制信息的內(nèi)存空間就是Socket的實(shí)體。

這里大家有可能不太清楚所以然,所以我用了一下 netstat 命令來給大伙看一下Socket是啥玩意。

我們?cè)?Windows 的命令提示符中輸入:

netstat-ano

# netstat 用于顯示Socket內(nèi)容 , -ano 是可選選項(xiàng)

# a 不僅顯示正在通信的Socket,還顯示包括尚未開始通信等狀態(tài)的所有Socket

# n 顯示 IP 地址和端口號(hào)

# o 顯示Socket的程序 PID

我的計(jì)算機(jī)會(huì)出現(xiàn)下面結(jié)果:

如上圖所示:

  • 1)每一行都相當(dāng)于一個(gè)Socket;

  • 2)每一列也被稱為一個(gè)元組。

所以,一個(gè)Socket就是五元組:

  • 1)協(xié)議;

  • 2)本地地址;

  • 3)外部地址;

  • 4)狀態(tài);

  • 5)PID。

PS:有的時(shí)候也被叫做四元組,四元組不包括協(xié)議。

我們來解讀一下上圖中的數(shù)據(jù),比如圖中的第一行:

1)它的協(xié)議就是 TCP,本地地址和遠(yuǎn)程地址都是?0.0.0.0(這表示通信還沒有開始,IP 地址暫時(shí)還未確定)。

2)而本地端口已知是 135,但是遠(yuǎn)程端口還未知,此時(shí)的狀態(tài)是 LISTENING(LISTENING 表示應(yīng)用程序已經(jīng)打開,正在等待與遠(yuǎn)程主機(jī)建立連接。關(guān)于各種狀態(tài)之間的轉(zhuǎn)換,大家可以閱讀《通俗易懂-深入理解TCP協(xié)議(上):理論基礎(chǔ)》)。

3)最后一個(gè)元組是 PID,即進(jìn)程標(biāo)識(shí)符,PID 就像我們的身份證號(hào)碼,能夠精確定位唯一的進(jìn)程。

3、Socket 是如何創(chuàng)建的

通過上節(jié)的講解,現(xiàn)在你可能對(duì) Socket 有了一個(gè)基本的認(rèn)識(shí),先喝口水,休息一下,讓我們繼續(xù)探究 Socket。

現(xiàn)在我有個(gè)問題,Socket 是如何創(chuàng)建的呢?

Socket 是和應(yīng)用程序一起創(chuàng)建的。

應(yīng)用程序中有一個(gè) socket 組件,在應(yīng)用程序啟動(dòng)時(shí),會(huì)調(diào)用 socket 申請(qǐng)創(chuàng)建Socket,協(xié)議棧會(huì)根據(jù)應(yīng)用程序的申請(qǐng)創(chuàng)建Socket:首先分配一個(gè)Socket所需的內(nèi)存空間,這一步相當(dāng)于是為控制信息準(zhǔn)備一個(gè)容器,但只有容器并沒有實(shí)際作用,所以你還需要向容器中放入控制信息;如果你不申請(qǐng)創(chuàng)建Socket所需要的內(nèi)存空間,你創(chuàng)建的控制信息也沒有地方存放,所以分配內(nèi)存空間,放入控制信息缺一不可。至此Socket的創(chuàng)建就已經(jīng)完成了。

Socket創(chuàng)建完成后,會(huì)返回一個(gè)Socket描述符給應(yīng)用程序,這個(gè)描述符相當(dāng)于是區(qū)分不同Socket的號(hào)碼牌。根據(jù)這個(gè)描述符,應(yīng)用程序在委托協(xié)議棧收發(fā)數(shù)據(jù)時(shí)就需要提供這個(gè)描述符。

4、Socket 是如何連接的

Socket創(chuàng)建完成后,最終還是為數(shù)據(jù)收發(fā)服務(wù)的。但是,在數(shù)據(jù)收發(fā)之前,還需要進(jìn)行一步“連接”(術(shù)語就是 connect),建立連接有一整套過程。

這個(gè)“連接”并不是真實(shí)的連接(用一根水管插在兩個(gè)電腦之間?不是你想的這樣。。。)。

實(shí)際上這個(gè)“連接”是應(yīng)用程序通過 TCP/IP 協(xié)議標(biāo)準(zhǔn)從一個(gè)主機(jī)通過網(wǎng)絡(luò)介質(zhì)傳輸?shù)搅硪粋€(gè)主機(jī)的過程。

Socket剛剛創(chuàng)建完成后,還沒有數(shù)據(jù),也不知道通信對(duì)象。

在這種狀態(tài)下:即使你讓客戶端應(yīng)用程序委托協(xié)議棧發(fā)送數(shù)據(jù),它也不知道發(fā)送到哪里。所以瀏覽器需要根據(jù)網(wǎng)址來查詢服務(wù)器的 IP 地址(做這項(xiàng)工作的協(xié)議是?DNS),查詢到目標(biāo)主機(jī)后,再把目標(biāo)主機(jī)的 IP 告訴協(xié)議棧。至此,客戶端這邊就準(zhǔn)備好了。

在服務(wù)器上:與客戶端一樣也需要?jiǎng)?chuàng)建Socket,但是同樣的它也不知道通信對(duì)象是誰,所以我們需要讓客戶端向服務(wù)器告知客戶端的必要信息:IP 地址和端口號(hào)。

現(xiàn)在通信雙方建立連接的必要信息已經(jīng)具備,可以開始“連接”過程了。

首先:客戶端應(yīng)用程序需要調(diào)用 Socket 庫中的?connect?方法,提供 socket 描述符和服務(wù)器 IP 地址、端口號(hào)。

以下是connect的偽碼調(diào)用:

connect(<描述符>、<服務(wù)器IP地址和端口號(hào)>)

這些信息會(huì)傳遞給協(xié)議棧中的 TCP 模塊,TCP 模塊會(huì)對(duì)請(qǐng)求報(bào)文進(jìn)行封裝,再傳遞給 IP 模塊,進(jìn)行 IP 報(bào)文頭的封裝,然后傳遞給物理層,進(jìn)行幀頭封裝。

之后通過網(wǎng)絡(luò)介質(zhì)傳遞給服務(wù)器,服務(wù)器上會(huì)對(duì)幀頭、IP 模塊、TCP 模塊的報(bào)文頭進(jìn)行解析,從而找到對(duì)應(yīng)的Socket。

Socket收到請(qǐng)求后,會(huì)寫入相應(yīng)的信息,并且把狀態(tài)改為正在連接。

請(qǐng)求過程完成后:服務(wù)器的 TCP 模塊會(huì)返回響應(yīng),這個(gè)過程和客戶端是一樣的(如果大家不太清楚報(bào)文頭的封裝過程,可以閱讀《快速理解TCP協(xié)議一篇就夠》)。

在一個(gè)完整的請(qǐng)求和響應(yīng)過程中,控制信息起到非常關(guān)鍵的作用:

  • 1)SYN 就是同步的縮寫,客戶端會(huì)首先發(fā)送 SYN 數(shù)據(jù)包,請(qǐng)求服務(wù)端建立連接;

  • 2)ACK 就是相應(yīng)的意思,它是對(duì)發(fā)送 SYN 數(shù)據(jù)包的響應(yīng);

  • 3)FIN 是終止的意思,它表示客戶端/服務(wù)器想要終止連接。

由于網(wǎng)絡(luò)環(huán)境的復(fù)雜多變,經(jīng)常會(huì)存在數(shù)據(jù)包丟失的情況,所以雙方通信時(shí)需要相互確認(rèn)對(duì)方的數(shù)據(jù)包是否已經(jīng)到達(dá),而判斷的標(biāo)準(zhǔn)就是 ACK 的值。

上面的文字不夠生動(dòng),動(dòng)畫可以更好的說明這個(gè)過程:

▲ 上圖引用自《跟著動(dòng)畫來學(xué)TCP三次握手和四次揮手》

PS:這個(gè)“連接”的詳細(xì)理論知識(shí),可以閱讀《理論經(jīng)典:TCP協(xié)議的3次握手與4次揮手過程詳解》、《跟著動(dòng)畫來學(xué)TCP三次握手和四次揮手》,這里不再贅述。)

當(dāng)所有建立連接的報(bào)文都能夠正常收發(fā)之后,此時(shí)套接字就已經(jīng)進(jìn)入可收發(fā)狀態(tài)了,此時(shí)可以認(rèn)為用一根管理把兩個(gè)套接字連接了起來。當(dāng)然,實(shí)際上并不存在這個(gè)管子。建立連接之后,協(xié)議棧的連接操作就結(jié)束了,也就是說 connect 已經(jīng)執(zhí)行完畢,控制流程被交回給應(yīng)用程序。

另外:如果你對(duì)Socket代碼更熟悉的話,可以先讀讀這篇《手把手教你寫基于TCP的Socket長連接》。

5、Socket 是如何收發(fā)數(shù)據(jù)的

當(dāng)控制流程上節(jié)中的連接過程回到應(yīng)用程序之后,接下來就會(huì)直接進(jìn)入數(shù)據(jù)收發(fā)階段。

數(shù)據(jù)收發(fā)操作是從應(yīng)用程序調(diào)用 write 將要發(fā)送的數(shù)據(jù)交給協(xié)議棧開始的,協(xié)議棧收到數(shù)據(jù)之后執(zhí)行發(fā)送操作。

協(xié)議棧不會(huì)關(guān)心應(yīng)用程序傳輸過來的是什么數(shù)據(jù),因?yàn)檫@些數(shù)據(jù)最終都會(huì)轉(zhuǎn)換為二進(jìn)制序列,協(xié)議棧在收到數(shù)據(jù)之后并不會(huì)馬上把數(shù)據(jù)發(fā)送出去,而是會(huì)將數(shù)據(jù)放在發(fā)送緩沖區(qū),再等待應(yīng)用程序發(fā)送下一條數(shù)據(jù)。

為什么收到數(shù)據(jù)包不會(huì)直接發(fā)送出去,而是放在緩沖區(qū)中呢?

因?yàn)橹灰坏┦盏綌?shù)據(jù)就會(huì)發(fā)送,就有可能發(fā)送大量的小數(shù)據(jù)包,導(dǎo)致網(wǎng)絡(luò)效率下降(所以協(xié)議棧需要將數(shù)據(jù)積攢到一定數(shù)量才能將其發(fā)送出去)。

至于協(xié)議棧會(huì)向緩沖區(qū)放多少數(shù)據(jù),這個(gè)不同版本和種類的操作系統(tǒng)有不同的說法。

不過,所有的操作系統(tǒng)都會(huì)遵循下面這幾個(gè)標(biāo)準(zhǔn):

1)第一個(gè)判斷要素:是每個(gè)網(wǎng)絡(luò)包能夠容納的數(shù)據(jù)長度,判斷的標(biāo)準(zhǔn)是 MTU,它表示的是一個(gè)網(wǎng)絡(luò)包的最大長度。最大長度包含頭部,所以如果單論數(shù)據(jù)區(qū)的話,就會(huì)用 MTU - 包頭長度,由此的出來的最大數(shù)據(jù)長度被稱為 MSS。

?

2)另一個(gè)判斷標(biāo)準(zhǔn):是時(shí)間,當(dāng)應(yīng)用程序產(chǎn)生的數(shù)據(jù)比較少,協(xié)議棧向緩沖區(qū)放置數(shù)據(jù)效率不高時(shí),如果每次都等到 MSS 再發(fā)送的話,可能因?yàn)榈却龝r(shí)間太長造成延遲。在這種情況下,即使數(shù)據(jù)長度沒有到達(dá) MSS,也應(yīng)該把數(shù)據(jù)發(fā)送出去。

但協(xié)議棧并沒有告訴我們?cè)鯓悠胶膺@兩個(gè)因素,如果數(shù)據(jù)長度優(yōu)先,那么效率有可能比較低;如果時(shí)間優(yōu)先,那又會(huì)降低網(wǎng)絡(luò)的效率。

經(jīng)過了一段時(shí)間。。。。。。

假設(shè)我們使用的是長度有限法則:此時(shí)緩沖區(qū)已滿,協(xié)議棧要發(fā)送數(shù)據(jù)了,協(xié)議棧剛要把數(shù)據(jù)發(fā)送出去,卻發(fā)現(xiàn)無法一次性傳輸這么大數(shù)據(jù)量(相對(duì)的)的數(shù)據(jù),那怎么辦呢?

在這種情況下,發(fā)送緩沖區(qū)中的數(shù)據(jù)就會(huì)超過 MSS 的長度,發(fā)送緩沖區(qū)中的數(shù)據(jù)會(huì)以 MSS 大小為一個(gè)數(shù)據(jù)包進(jìn)行拆分,拆分出來的每塊數(shù)據(jù)都會(huì)加上 TCP,IP,以太網(wǎng)頭部,然后被放進(jìn)單獨(dú)的網(wǎng)絡(luò)包中。

到現(xiàn)在,網(wǎng)絡(luò)包已經(jīng)準(zhǔn)備好發(fā)往服務(wù)器了,但是數(shù)據(jù)發(fā)送操作還沒有結(jié)束,因?yàn)榉?wù)器還未確認(rèn)是否已經(jīng)收到網(wǎng)絡(luò)包。因此在客戶端發(fā)送數(shù)據(jù)包之后,還需要服務(wù)器進(jìn)行確認(rèn)。

TCP 模塊在拆分?jǐn)?shù)據(jù)時(shí),會(huì)計(jì)算出網(wǎng)絡(luò)包偏移量,這個(gè)偏移量就是相對(duì)于數(shù)據(jù)從頭開始計(jì)算的第幾個(gè)字節(jié),并將算好的字節(jié)數(shù)寫在 TCP 頭部,TCP 模塊還會(huì)生成一個(gè)網(wǎng)絡(luò)包的序號(hào)(SYN),這個(gè)序號(hào)是唯一的,這個(gè)序號(hào)就是用來讓服務(wù)器進(jìn)行確認(rèn)的。

服務(wù)器會(huì)對(duì)客戶端發(fā)送過來的數(shù)據(jù)包進(jìn)行確認(rèn),確認(rèn)無誤之后,服務(wù)器會(huì)生成一個(gè)序號(hào)和確認(rèn)號(hào)(ACK)并一起發(fā)送給客戶端,客戶端確認(rèn)之后再發(fā)送確認(rèn)號(hào)給服務(wù)器。

我們來看一下實(shí)際的工作過程:

首先:客戶端在連接時(shí)需要計(jì)算出序號(hào)初始值,并將這個(gè)值發(fā)送給服務(wù)器。

接下來:服務(wù)器通過這個(gè)初始值計(jì)算出確認(rèn)號(hào)并返回給客戶端(初始值在通信過程中有可能會(huì)丟棄,因此當(dāng)服務(wù)器收到初始值后需要返回確認(rèn)號(hào)用于確認(rèn))。

同時(shí):服務(wù)器也需要計(jì)算出從服務(wù)器到客戶端方向的序號(hào)初始值,并將這個(gè)值發(fā)送給客戶端。然后,客戶端也需要根據(jù)服務(wù)器發(fā)來的初始值計(jì)算出確認(rèn)號(hào)發(fā)送給服務(wù)器。

至此:連接建立完成,接下來就可以進(jìn)入數(shù)據(jù)收發(fā)階段了。

數(shù)據(jù)收發(fā)階段中,通信雙方可以同時(shí)發(fā)送請(qǐng)求和響應(yīng),雙方也可以同時(shí)對(duì)請(qǐng)求進(jìn)行確認(rèn)。

請(qǐng)求 - 確認(rèn)機(jī)制非常強(qiáng)大:通過這一機(jī)制,我們可以確認(rèn)接收方有沒有收到某個(gè)包,如果沒有收到則重新發(fā)送,這樣一來,但凡網(wǎng)絡(luò)中出現(xiàn)的任何錯(cuò)誤,我們都可以即使發(fā)現(xiàn)并補(bǔ)救。

上面的文字不夠生動(dòng),動(dòng)畫可以更好的理解請(qǐng)求 - 確認(rèn)機(jī)制:

▲ 上圖引用自《跟著動(dòng)畫來學(xué)TCP三次握手和四次揮手》

網(wǎng)卡、集線器、路由器(見《史上最通俗的集線器、交換機(jī)、路由器功能原理入門》)都沒有錯(cuò)誤補(bǔ)救機(jī)制,一旦檢測到錯(cuò)誤就會(huì)直接丟棄數(shù)據(jù)包,應(yīng)用程序也沒有這種機(jī)制,起作用的只是 TCP/IP 模塊。

由于網(wǎng)絡(luò)環(huán)境復(fù)雜多變,所以數(shù)據(jù)包會(huì)存在丟失情況,因此發(fā)送序號(hào)和確認(rèn)號(hào)也存在一定規(guī)則,TCP 會(huì)通過窗口管理確認(rèn)號(hào),我們這篇文章不再贅述,大家可以閱讀《通俗易懂-深入理解TCP協(xié)議(下):RTT、滑動(dòng)窗口、擁塞處理》來尋找答案。

PS:另一篇《我們?cè)谧x寫Socket時(shí),究竟在讀寫什么?》中用動(dòng)畫詳細(xì)說明了這個(gè)過程,有興趣可以讀一讀。

6、Socket 是如何斷開連接的

當(dāng)通信雙方不再需要收發(fā)數(shù)據(jù)時(shí),需要斷開連接。不同的應(yīng)用程序斷開連接的時(shí)機(jī)不同。

以 Web 為例:瀏覽器向 Web 服務(wù)器發(fā)送請(qǐng)求消息,Web 服務(wù)器再返回響應(yīng)消息,這時(shí)收發(fā)數(shù)據(jù)就全部結(jié)束了,服務(wù)器可能會(huì)首先發(fā)起斷開響應(yīng),當(dāng)然客戶端也有可能會(huì)首先發(fā)起(誰先斷開連接是應(yīng)用程序做出的判斷),與協(xié)議棧無關(guān)。

無論哪一方發(fā)起斷開連接的請(qǐng)求,都會(huì)調(diào)用 Socket 庫的 close 程序。

我們以服務(wù)器斷開連接為例:服務(wù)器發(fā)起斷開連接請(qǐng)求,協(xié)議棧會(huì)生成斷開連接的 TCP 頭部,其實(shí)就是設(shè)置 FIN 位,然后委托 IP 模塊向客戶端發(fā)送數(shù)據(jù),與此同時(shí),服務(wù)器的Socket會(huì)記錄下斷開連接的相關(guān)信息。

收到服務(wù)器發(fā)來 FIN 請(qǐng)求后:客戶端協(xié)議棧會(huì)將Socket標(biāo)記為斷開連接狀態(tài),然后,客戶端會(huì)向服務(wù)器返回一個(gè)確認(rèn)號(hào),這是斷開連接的第一步,在這一步之后,應(yīng)用程序還會(huì)調(diào)用 read 來讀取數(shù)據(jù)。等到服務(wù)器數(shù)據(jù)發(fā)送完成后,協(xié)議棧會(huì)通知客戶端應(yīng)用程序數(shù)據(jù)已經(jīng)接收完畢。

只要收到服務(wù)器返回的所有數(shù)據(jù),客戶端就會(huì)調(diào)用 close 程序來結(jié)束收發(fā)操作,這時(shí)客戶端會(huì)生成一個(gè) FIN 發(fā)送給服務(wù)器,一段時(shí)間后服務(wù)器返回 ACK 號(hào)。至此,客戶端和服務(wù)器的通信就結(jié)束了。

上面的文字不夠生動(dòng),動(dòng)畫可以更好的說明這個(gè)過程:

▲ 上圖引用自《跟著動(dòng)畫來學(xué)TCP三次握手和四次揮手》

PS:斷開連接的詳細(xì)理論知識(shí),可以閱讀《理論經(jīng)典:TCP協(xié)議的3次握手與4次揮手過程詳解》、《跟著動(dòng)畫來學(xué)TCP三次握手和四次揮手》,這里不再贅述。

7、Socket的刪除

上述通信過程完成后,用來通信的Socket就不再會(huì)使用了,此時(shí)我們就可以刪除這個(gè)Socket了。

不過,這時(shí)候Socket不會(huì)馬上刪除,而是等過一段時(shí)間再刪除。

等待這段時(shí)間是為了防止誤操作,最常見的誤操作就是客戶端返回的確認(rèn)號(hào)丟失,至于等待多長時(shí)間,和數(shù)據(jù)包重傳的方式有關(guān),這里我們就深入展開討論了。

關(guān)于Socket操作的全過程,如果從系統(tǒng)的角度來看,可能會(huì)更深入一些,建議可以深入閱讀張彥飛的《深入操作系統(tǒng),從內(nèi)核理解網(wǎng)絡(luò)包的接收過程(Linux篇)》一文。

8、系列文章

本文是系列文章中的第14篇,本系列文章的大綱如下:

[1]?網(wǎng)絡(luò)編程懶人入門(一):快速理解網(wǎng)絡(luò)通信協(xié)議(上篇)

[2]?網(wǎng)絡(luò)編程懶人入門(二):快速理解網(wǎng)絡(luò)通信協(xié)議(下篇)

[3]?網(wǎng)絡(luò)編程懶人入門(三):快速理解TCP協(xié)議一篇就夠

[4]?網(wǎng)絡(luò)編程懶人入門(四):快速理解TCP和UDP的差異

[5]?網(wǎng)絡(luò)編程懶人入門(五):快速理解為什么說UDP有時(shí)比TCP更有優(yōu)勢(shì)

[6]?網(wǎng)絡(luò)編程懶人入門(六):史上最通俗的集線器、交換機(jī)、路由器功能原理入門

[7]?網(wǎng)絡(luò)編程懶人入門(七):深入淺出,全面理解HTTP協(xié)議

[8]?網(wǎng)絡(luò)編程懶人入門(八):手把手教你寫基于TCP的Socket長連接

[9]?網(wǎng)絡(luò)編程懶人入門(九):通俗講解,有了IP地址,為何還要用MAC地址?

[10]?網(wǎng)絡(luò)編程懶人入門(十):一泡尿的時(shí)間,快速讀懂QUIC協(xié)議

[11]?網(wǎng)絡(luò)編程懶人入門(十一):一文讀懂什么是IPv6

[12]?網(wǎng)絡(luò)編程懶人入門(十二):快速讀懂Http/3協(xié)議,一篇就夠!

[13]?網(wǎng)絡(luò)編程懶人入門(十三):一泡尿的時(shí)間,快速搞懂TCP和UDP的區(qū)別

[14]?網(wǎng)絡(luò)編程懶人入門(十四):到底什么是Socket?一文即懂!(* 本文)

9、參考資料

[1]?TCP/IP詳解?-?第17章·TCP:傳輸控制協(xié)議

[2]?TCP/IP詳解?-?第18章·TCP連接的建立與終止

[3]?TCP/IP詳解?-?第21章·TCP的超時(shí)與重傳

[4]?快速理解網(wǎng)絡(luò)通信協(xié)議(上篇)

[5]?快速理解網(wǎng)絡(luò)通信協(xié)議(下篇)

[6]?面視必備,史上最通俗計(jì)算機(jī)網(wǎng)絡(luò)分層詳解

[7]?假如你來設(shè)計(jì)網(wǎng)絡(luò),會(huì)怎么做?

[8]?假如你來設(shè)計(jì)TCP協(xié)議,會(huì)怎么做?

[10]?淺析TCP協(xié)議中的疑難雜癥(下篇)

[11]?關(guān)閉TCP連接時(shí)為什么會(huì)TIME_WAIT、CLOSE_WAIT

[12]?從底層入手,深度分析TCP連接耗時(shí)的秘密

(本文已同步發(fā)布于:http://www.52im.net/thread-3821-1-1.html)


網(wǎng)絡(luò)編程懶人入門(十四):到底什么是Socket?一文即懂!的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
屏山县| 六盘水市| 武强县| 石景山区| 宜兰县| 阿拉善左旗| 洱源县| 那曲县| 虞城县| 岱山县| 嘉黎县| 满洲里市| 新化县| 陵川县| 玉林市| 灵丘县| 德格县| 敦化市| 油尖旺区| 麻城市| 新宾| 久治县| 成安县| 商河县| 蕲春县| 河西区| 团风县| 墨竹工卡县| 鄂尔多斯市| 栾城县| 霸州市| 齐河县| 天柱县| 于田县| 台山市| 昆明市| 称多县| 阜新市| 杭锦旗| 永州市| 义马市|