前言
Socket 是什么?
Socket 運(yùn)行流程
基于 TCP
基于 UDP
Socket TCP 是如何建立連接的
三次握手發(fā)生在 socket 的哪幾個(gè)函數(shù)中
Socket TCP 是如何斷開(kāi)連接的
第四次揮手后為何要等待 2MSL
一說(shuō)到網(wǎng)絡(luò),大家必然會(huì)想到 TCP、UDP、Http、三握四揮等,但是一說(shuō) Socket,大家可能會(huì)有點(diǎn)模糊了,只知道網(wǎng)絡(luò)中會(huì)用到,但是 Socket 究竟是什么? 套接字又是啥?為啥網(wǎng)絡(luò)離不開(kāi) Socket?
Socket 其實(shí)就是套接字,大部分人對(duì)于 Socket 的理解就是它可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)通信,但是它「具體解決了哪些問(wèn)題?有什么實(shí)際的作用?為什么會(huì)有一個(gè) Socket 出現(xiàn)?」
Socket 其實(shí)是在「應(yīng)用層與傳輸層之間的一個(gè)產(chǎn)物」,它把傳輸層的很多復(fù)雜操作封裝成一些簡(jiǎn)單的接口,來(lái)讓?xiě)?yīng)用層調(diào)用以此來(lái)實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中的通信,Socket 是對(duì)端口通信開(kāi)發(fā)的工具,它要更底層一些。
Socket 其實(shí)類似于一臺(tái)洗碗機(jī),它的功能就是洗碗(網(wǎng)絡(luò)通信),如果沒(méi)有它,你可能需要自己手動(dòng)去洗碗(手動(dòng)調(diào)用傳輸層、應(yīng)用層之間的各個(gè) api),但是有了它你只需要點(diǎn)擊開(kāi)關(guān)、調(diào)整時(shí)長(zhǎng)就行了(封裝了 api),你可以不需要它,但是如果沒(méi)有它,洗碗(應(yīng)用層與傳輸層之間的交互)將變得非常繁瑣。
一次完整的網(wǎng)絡(luò)通信必不可少的會(huì)經(jīng)過(guò)物理傳輸層的網(wǎng)線和網(wǎng)卡,網(wǎng)絡(luò)傳輸層的 IP 協(xié)議可以知道要將數(shù)據(jù)傳送給哪臺(tái)機(jī)器,但是在計(jì)算機(jī)系統(tǒng)中會(huì)運(yùn)行不同進(jìn)程,那要如何把「網(wǎng)卡中的網(wǎng)絡(luò)數(shù)據(jù)識(shí)別出來(lái)是給哪個(gè)進(jìn)程的」,這其實(shí)就是 Socket 設(shè)計(jì)的想解決的一點(diǎn)了。
Socket 是「對(duì) TCP/IP 或者 UDP/IP 協(xié)議的封裝」,Socket 本身其實(shí)就是一個(gè)調(diào)用接口。通過(guò)這個(gè)接口我們?cè)陂_(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用程序的時(shí)候,就可以不用關(guān)心底層是怎么實(shí)現(xiàn)的,減輕開(kāi)發(fā)的難度。
這里我就不細(xì)寫(xiě)了,其實(shí)大同小異,從流程圖上就可以看到
因?yàn)?UDP 是無(wú)狀態(tài)的,所以對(duì)于服務(wù)端來(lái)說(shuō)沒(méi)有連接,并且其會(huì)在調(diào)用 Recvfrom() 方法后就收客戶端的請(qǐng)求,并一直阻塞,直到收到信息
在 Socket 綁定完服務(wù)器的地址后,就開(kāi)始和服務(wù)器建立連接了,TCP 建立連接的方式其實(shí)就是大名鼎鼎三次握手了
在建立連接之后,connect() 就已經(jīng)執(zhí)行完畢了,服務(wù)端就可以向客戶端發(fā)送數(shù)據(jù)了。
首先 2MSL 的時(shí)間是從客戶端(A)接收到 FIN 后發(fā)送 ACK 開(kāi)始計(jì)時(shí)的。如果在 TIME-WAIT 時(shí)間內(nèi),因?yàn)榭蛻舳?A)的 ACK 沒(méi)有傳輸?shù)椒?wù)端(B),客戶端(A)又接收到了服務(wù)端(B)重發(fā)的 FIN 報(bào)文,那么 2MSL 時(shí)間會(huì)被重置。等待 2MSL 原因如下
在最后一次揮手后 A 并不知道 B 是否接到自己的信息, 包括 ACK 是以上哪兩種情況,A 都需要等待,要取這「兩種情況等待時(shí)間的最大值,以應(yīng)對(duì)最壞的情況發(fā)生」,這個(gè)最壞情況是:去向ACK消息最大存活時(shí)間(MSL) + 來(lái)向FIN消息的最大存活時(shí)間(MSL)。這剛好是2MSL,這個(gè)時(shí)間,足以使得原來(lái)連接的數(shù)據(jù)包在網(wǎng)絡(luò)中消失。
因?yàn)檫@個(gè) ACK 是有可能丟失的,會(huì)導(dǎo)致服務(wù)器收不到對(duì) FIN-ACK 確認(rèn)報(bào)文。假設(shè)客戶端不等待 2MSL ,而是在發(fā)送完 ACK 之后直接釋放關(guān)閉,一但這個(gè) ACK 丟失的話,服務(wù)器就無(wú)法正常的進(jìn)入關(guān)閉連接狀態(tài)。
以上就是面試官:Socket TCP 是如何斷開(kāi)連接的?的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)