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

首頁(yè) Java Java面試題 面試官:Socket TCP 是如何斷開(kāi)連接的?

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

Aug 17, 2023 pm 04:10 PM
socket tcp

  • 前言

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

本站聲明
本文內(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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

Laravel 教程
1601
29
PHP教程
1502
276