国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

面試官:Socket TCP 是如何斷開(kāi)連接的?

發(fā)布: 2023-08-17 16:10:10
轉(zhuǎn)載
2084人瀏覽過(guò)
  • 前言

  • 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 是什么?

Socket 其實(shí)就是套接字,大部分人對(duì)于 Socket 的理解就是它可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)通信,但是它「具體解決了哪些問(wèn)題?有什么實(shí)際的作用?為什么會(huì)有一個(gè) Socket 出現(xiàn)?」

面試官:Socket TCP 是如何斷開(kāi)連接的?

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)用層與傳輸層之間的交互)將變得非常繁瑣。

面試官:Socket TCP 是如何斷開(kāi)連接的?

一次完整的網(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ā)的難度。

Socket 運(yùn)行流程

基于 TCP

面試官:Socket TCP 是如何斷開(kāi)連接的?

Server

  • socket():表示創(chuàng)建一個(gè) socket,底層會(huì)生成一個(gè)文件描述符,用來(lái)表示該 socket
  • bind():用來(lái)綁定服務(wù)的端口,地址,這里一般都是以固定的為主,因?yàn)樵诳蛻舳诉B接的時(shí)候需要指定
  • listen():當(dāng)綁定完成之后,listen 就會(huì)監(jiān)聽(tīng)這個(gè)端口的數(shù)據(jù)包
  • accept():相當(dāng)于一個(gè)開(kāi)關(guān),表示我準(zhǔn)備好了,可以接受請(qǐng)求了,但是這里會(huì)一直阻塞,直到客戶端連接成功
  • read():讀取客戶端發(fā)送過(guò)來(lái)的內(nèi)容
  • write():客戶端寫(xiě)入要返回的數(shù)據(jù)
  • close():斷開(kāi)連接,「四次揮手」

Client

  • socket():表示創(chuàng)建一個(gè) socket,底層會(huì)生成一個(gè)文件描述符,用來(lái)表示該 socket
  • connet():表示與指定地址進(jìn)行連接,在此之前,會(huì)隨機(jī)創(chuàng)建自己的端口,tcp 的「三次握手就是從這里開(kāi)始」
  • write():客戶端寫(xiě)入要發(fā)送的數(shù)據(jù)
  • read():客戶端讀取服務(wù)端返回的數(shù)據(jù)
  • close():斷開(kāi)連接,「四次揮手」,給客戶端發(fā)送斷開(kāi)連接的信息

基于 UDP

面試官:Socket TCP 是如何斷開(kāi)連接的?

這里我就不細(xì)寫(xiě)了,其實(shí)大同小異,從流程圖上就可以看到

因?yàn)?UDP 是無(wú)狀態(tài)的,所以對(duì)于服務(wù)端來(lái)說(shuō)沒(méi)有連接,并且其會(huì)在調(diào)用 Recvfrom() 方法后就收客戶端的請(qǐng)求,并一直阻塞,直到收到信息

Socket TCP 是如何建立連接的

在 Socket 綁定完服務(wù)器的地址后,就開(kāi)始和服務(wù)器建立連接了,TCP 建立連接的方式其實(shí)就是大名鼎鼎三次握手了

面試官:Socket TCP 是如何斷開(kāi)連接的?
  • 第一次握手:A 的 TCP 進(jìn)程創(chuàng)建一個(gè) 傳輸控制塊 TCB ,然后向 B 發(fā)出連接請(qǐng)求報(bào)文段。之后將同步位 SYN 設(shè)置為 1,同時(shí)選擇一個(gè)初始序列號(hào) seq=x,這時(shí)客戶端 A 進(jìn)入到 SYN-SENT(同步已發(fā)送)狀態(tài)。
  • 第二次握手:B 收到連接請(qǐng)求報(bào)文段,如果同意建立連接,則向 A 發(fā)送確認(rèn)。在確認(rèn)報(bào)文段中 同步位 SYN=1、確認(rèn)位 ACK=1、確認(rèn)號(hào) ack=x+1,同時(shí)也為自己選擇一個(gè)初始序列號(hào) seq=y,這時(shí)服務(wù)器 B 進(jìn)入 SYN-RCVID 狀態(tài)。
  • 第三次握手:A 收到 B 的確認(rèn)以后,再向 B 發(fā)出確認(rèn)。確認(rèn)報(bào)文 ACK=1、確認(rèn)號(hào)ack=y+1。這時(shí)A進(jìn)入到 ESTAB-LISHED 狀態(tài)。當(dāng)B接收到A的確認(rèn)后,也進(jìn)入 ESTAB-LISHED 狀態(tài)。連接建立完成

三次握手發(fā)生在 socket 的哪幾個(gè)函數(shù)中

面試官:Socket TCP 是如何斷開(kāi)連接的?
  • 當(dāng)客戶端調(diào)用 connect 時(shí),觸發(fā)了連接請(qǐng)求,向服務(wù)器發(fā)送了SYN 信號(hào),這時(shí) connect 進(jìn)入阻塞狀態(tài);
  • 服務(wù)器監(jiān)聽(tīng)到連接請(qǐng)求,即收到 SYN,調(diào)用 accept 函數(shù)接收,進(jìn)入阻塞狀態(tài),在此之前會(huì)盡力 socket、bind、listen 函數(shù);然后返回相關(guān)的 syn 以及 ack 信號(hào)
  • 客戶端接受到服務(wù)端的信息,此時(shí) connect 完成,解除阻塞狀態(tài),并且向服務(wù)端發(fā)送 ack 信號(hào)
  • 服務(wù)端收到 ack, accept 阻塞解除,完成連接

在建立連接之后,connect() 就已經(jīng)執(zhí)行完畢了,服務(wù)端就可以向客戶端發(fā)送數(shù)據(jù)了。

Socket TCP 是如何斷開(kāi)連接的

面試官:Socket TCP 是如何斷開(kāi)連接的?
  • 第一次揮手:A 先發(fā)送連接釋放報(bào)文段,段首部的終止控制位 FIN=1,序號(hào)seq=u(等于A前面發(fā)送數(shù)據(jù)的最后一個(gè)序號(hào)加1);然后 A 進(jìn)入 FIN-WAIT-1(終止等待1)狀態(tài),等待 B 的確認(rèn)。
  • 第二次揮手:B 收到 A 的連接釋放報(bào)文段后,立刻發(fā)出確認(rèn)報(bào)文段,確認(rèn)號(hào) ack=u+1,序號(hào) seq=v(等于 B 前面發(fā)送數(shù)據(jù)的最后一個(gè)序號(hào)加1);然后 B 進(jìn)入 CLOSE-WAIT(關(guān)閉等待)狀態(tài)。
  • 第三次揮手:A 收到 B 的確認(rèn)報(bào)文段后進(jìn)入到 FIN-WAIT-2(終止等待2)狀態(tài),繼續(xù)等待 B 發(fā)出連接釋放報(bào)文段;
    • 若 B 已經(jīng)沒(méi)有數(shù)據(jù)要發(fā)送,B 就會(huì)向 A 發(fā)送連接釋放報(bào)文段,段首部的終止控制位 FIN=1,序號(hào) seq=w(半關(guān)閉狀態(tài)可能又發(fā)送了一些數(shù)據(jù)),確認(rèn)號(hào) ack=u+1,這時(shí)B進(jìn)入 LAST-ACK(最后確認(rèn))狀態(tài),等待A的確認(rèn)。
  • 第四次揮手:A收到B的連接釋放報(bào)文段并發(fā)出確認(rèn),確認(rèn)段中 確認(rèn)位 ACK=1,確認(rèn)號(hào) ack=w+1,序號(hào) seq=u+1;然后 A 進(jìn)入到TIME-WAIT(時(shí)間等待)狀態(tài)。當(dāng) B 再接收到該確認(rèn)段后,B 就進(jìn)入 CLOSED狀態(tài)。

第四次揮手后為何要等待 2MSL

首先 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 原因如下

  • 1.得原來(lái)連接的數(shù)據(jù)包消失
    • 如果B沒(méi)有收到自己的ACK,會(huì)超時(shí)重傳FiN那么A再次接到重傳的FIN,會(huì)再次發(fā)送ACK
    • 如果B收到自己的ACK,也不會(huì)再發(fā)任何消息

在最后一次揮手后 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ò)中消失。

  • 2.保證 ACK 能被服務(wù)端接收到從而正確關(guān)閉鏈接

因?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)文章!

最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件
最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件

每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。

下載
來(lái)源:Java后端技術(shù)全棧網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問(wèn)題
開(kāi)源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見(jiàn)反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)