最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

兩張動圖--帶你搞懂TCP的三次握手與四次揮手

 更新時間:2021年06月22日 14:35:54   作者:小書go  
TCP是一種傳輸控制協(xié)議,是面向連接的、可靠的、基于字節(jié)流之間的傳輸層通信協(xié)議,由IETF的RFC 793定義。在簡化的計算機(jī)網(wǎng)絡(luò)OSI模型中,TCP完成第四層傳輸層所指定的功能

背景描述

通過上一篇中網(wǎng)絡(luò)模型中的IP層的介紹,我們知道網(wǎng)絡(luò)層,可以實現(xiàn)兩個主機(jī)之間的通信。但是這并不具體,因為,真正進(jìn)行通信的實體是在主機(jī)中的進(jìn)程,是一個主機(jī)中的一個進(jìn)程與另外一個主機(jī)中的一個進(jìn)程在交換數(shù)據(jù)。IP協(xié)議雖然能把數(shù)據(jù)報文送到目的主機(jī),但是并沒有交付給主機(jī)的具體應(yīng)用進(jìn)程。而端到端的通信才應(yīng)該是應(yīng)用進(jìn)程之間的通信。

UDP,在傳送數(shù)據(jù)前不需要先建立連接,遠(yuǎn)地的主機(jī)在收到UDP報文后也不需要給出任何確認(rèn)。雖然UDP不提供可靠交付,但是正是因為這樣,省去和很多的開銷,使得它的速度比較快,比如一些對實時性要求較高的服務(wù),就常常使用的是UDP。對應(yīng)的應(yīng)用層的協(xié)議主要有 DNS,TFTP,DHCP,SNMP,NFS 等。

TCP,提供面向連接的服務(wù),在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送完成后要釋放連接。因此TCP是一種可靠的的運輸服務(wù),但是正因為這樣,不可避免的增加了許多的開銷,比如確認(rèn),流量控制等。對應(yīng)的應(yīng)用層的協(xié)議主要有 SMTP,TELNET,HTTP,FTP 等。

應(yīng)用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL
熟知端口 21,20 69 23 25 53 80 22 3306
傳輸層協(xié)議 TCP UDP TCP TCP UDP TCP TCP TCP

TCP的概述

TCP把連接作為最基本的對象,每一條TCP連接都有兩個端點,這種斷點我們叫作套接字(socket),它的定義為端口號拼接到IP地址即構(gòu)成了套接字,例如,若IP地址為192.3.4.16 而端口號為80,那么得到的套接字為192.3.4.16:80。

TCP報文首部

1.源端口和目的端口,各占2個字節(jié),分別寫入源端口和目的端口;

2.序號,占4個字節(jié),TCP連接中傳送的字節(jié)流中的每個字節(jié)都按順序編號。例如,一段報文的序號字段值是 301 ,而攜帶的數(shù)據(jù)共有100字段,顯然下一個報文段(如果還有的話)的數(shù)據(jù)序號應(yīng)該從401開始;

3.確認(rèn)號,占4個字節(jié),是期望收到對方下一個報文的第一個數(shù)據(jù)字節(jié)的序號。例如,B收到了A發(fā)送過來的報文,其序列號字段是501,而數(shù)據(jù)長度是200字節(jié),這表明B正確的收到了A發(fā)送的到序號700為止的數(shù)據(jù)。因此,B期望收到A的下一個數(shù)據(jù)序號是701,于是B在發(fā)送給A的確認(rèn)報文段中把確認(rèn)號置為701;

4.數(shù)據(jù)偏移,占4位,它指出TCP報文的數(shù)據(jù)距離TCP報文段的起始處有多遠(yuǎn);

5.保留,占6位,保留今后使用,但目前應(yīng)都位0;

6.緊急URG,當(dāng)URG=1,表明緊急指針字段有效。告訴系統(tǒng)此報文段中有緊急數(shù)據(jù);

7.確認(rèn)ACK,僅當(dāng)ACK=1時,確認(rèn)號字段才有效。TCP規(guī)定,在連接建立后所有報文的傳輸都必須把ACK置1;

8.推送PSH,當(dāng)兩個應(yīng)用進(jìn)程進(jìn)行交互式通信時,有時在一端的應(yīng)用進(jìn)程希望在鍵入一個命令后立即就能收到對方的響應(yīng),這時候就將PSH=1;

9.復(fù)位RST,當(dāng)RST=1,表明TCP連接中出現(xiàn)嚴(yán)重差錯,必須釋放連接,然后再重新建立連接;

10.同步SYN,在連接建立時用來同步序號。當(dāng)SYN=1,ACK=0,表明是連接請求報文,若同意連接,則響應(yīng)報文中應(yīng)該使SYN=1,ACK=1;

11.終止FIN,用來釋放連接。當(dāng)FIN=1,表明此報文的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并且要求釋放;

12.窗口,占2字節(jié),指的是通知接收方,發(fā)送本報文你需要有多大的空間來接受;

13.檢驗和,占2字節(jié),校驗首部和數(shù)據(jù)這兩部分;

14.緊急指針,占2字節(jié),指出本報文段中的緊急數(shù)據(jù)的字節(jié)數(shù);

15.選項,長度可變,定義一些其他的可選的參數(shù)。

TCP連接的建立(三次握手)

這里寫圖片描述

最開始的時候客戶端和服務(wù)器都是處于CLOSED狀態(tài)。主動打開連接的為客戶端,被動打開連接的是服務(wù)器。

1.TCP服務(wù)器進(jìn)程先創(chuàng)建傳輸控制塊TCB,時刻準(zhǔn)備接受客戶進(jìn)程的連接請求,此時服務(wù)器就進(jìn)入了LISTEN(監(jiān)聽)狀態(tài);

2.TCP客戶進(jìn)程也是先創(chuàng)建傳輸控制塊TCB,然后向服務(wù)器發(fā)出連接請求報文,這是報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x ,此時,TCP客戶端進(jìn)程進(jìn)入了 SYN-SENT(同步已發(fā)送狀態(tài))狀態(tài)。TCP規(guī)定,SYN報文段(SYN=1的報文段)不能攜帶數(shù)據(jù),但需要消耗掉一個序號。

3.TCP服務(wù)器收到請求報文后,如果同意連接,則發(fā)出確認(rèn)報文。確認(rèn)報文中應(yīng)該 ACK=1,SYN=1,確認(rèn)號是ack=x+1,同時也要為自己初始化一個序列號 seq=y,此時,TCP服務(wù)器進(jìn)程進(jìn)入了SYN-RCVD(同步收到)狀態(tài)。這個報文也不能攜帶數(shù)據(jù),但是同樣要消耗一個序號。

4.TCP客戶進(jìn)程收到確認(rèn)后,還要向服務(wù)器給出確認(rèn)。確認(rèn)報文的ACK=1,ack=y+1,自己的序列號seq=x+1,此時,TCP連接建立,客戶端進(jìn)入ESTABLISHED(已建立連接)狀態(tài)。TCP規(guī)定,ACK報文段可以攜帶數(shù)據(jù),但是如果不攜帶數(shù)據(jù)則不消耗序號。

5.當(dāng)服務(wù)器收到客戶端的確認(rèn)后也進(jìn)入ESTABLISHED狀態(tài),此后雙方就可以開始通信了。

三次握手

什么TCP客戶端最后還要發(fā)送一次確認(rèn)呢?

一句話,主要防止已經(jīng)失效的連接請求報文突然又傳送到了服務(wù)器,從而產(chǎn)生錯誤。

如果使用的是兩次握手建立連接,假設(shè)有這樣一種場景,客戶端發(fā)送了第一個請求連接并且沒有丟失,只是因為在網(wǎng)絡(luò)結(jié)點中滯留的時間太長了,由于TCP的客戶端遲遲沒有收到確認(rèn)報文,以為服務(wù)器沒有收到,此時重新向服務(wù)器發(fā)送這條報文,此后客戶端和服務(wù)器經(jīng)過兩次握手完成連接,傳輸數(shù)據(jù),然后關(guān)閉連接。此時此前滯留的那一次請求連接,網(wǎng)絡(luò)通暢了到達(dá)了服務(wù)器,這個報文本該是失效的,但是,兩次握手的機(jī)制將會讓客戶端和服務(wù)器再次建立連接,這將導(dǎo)致不必要的錯誤和資源的浪費。

如果采用的是三次握手,就算是那一次失效的報文傳送過來了,服務(wù)端接受到了那條失效報文并且回復(fù)了確認(rèn)報文,但是客戶端不會再次發(fā)出確認(rèn)。由于服務(wù)器收不到確認(rèn),就知道客戶端并沒有請求連接。

TCP連接的釋放(四次揮手)

這里寫圖片描述

數(shù)據(jù)傳輸完畢后,雙方都可釋放連接。最開始的時候,客戶端和服務(wù)器都是處于ESTABLISHED狀態(tài),然后客戶端主動關(guān)閉,服務(wù)器被動關(guān)閉。

客戶端進(jìn)程發(fā)出連接釋放報文,并且停止發(fā)送數(shù)據(jù)。釋放數(shù)據(jù)報文首部,F(xiàn)IN=1,其序列號為seq=u(等于前面已經(jīng)傳送過來的數(shù)據(jù)的最后一個字節(jié)的序號加1),此時,客戶端進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)。 TCP規(guī)定,F(xiàn)IN報文段即使不攜帶數(shù)據(jù),也要消耗一個序號。

服務(wù)器收到連接釋放報文,發(fā)出確認(rèn)報文,ACK=1,ack=u+1,并且?guī)献约旱男蛄刑杝eq=v,此時,服務(wù)端就進(jìn)入了CLOSE-WAIT(關(guān)閉等待)狀態(tài)。TCP服務(wù)器通知高層的應(yīng)用進(jìn)程,客戶端向服務(wù)器的方向就釋放了,這時候處于半關(guān)閉狀態(tài),即客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送了,但是服務(wù)器若發(fā)送數(shù)據(jù),客戶端依然要接受。這個狀態(tài)還要持續(xù)一段時間,也就是整個CLOSE-WAIT狀態(tài)持續(xù)的時間。

客戶端收到服務(wù)器的確認(rèn)請求后,此時,客戶端就進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài),等待服務(wù)器發(fā)送連接釋放報文(在這之前還需要接受服務(wù)器發(fā)送的最后的數(shù)據(jù))。

服務(wù)器將最后的數(shù)據(jù)發(fā)送完畢后,就向客戶端發(fā)送連接釋放報文,F(xiàn)IN=1,ack=u+1,由于在半關(guān)閉狀態(tài),服務(wù)器很可能又發(fā)送了一些數(shù)據(jù),假定此時的序列號為seq=w,此時,服務(wù)器就進(jìn)入了LAST-ACK(最后確認(rèn))狀態(tài),等待客戶端的確認(rèn)。

客戶端收到服務(wù)器的連接釋放報文后,必須發(fā)出確認(rèn),ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進(jìn)入了TIME-WAIT(時間等待)狀態(tài)。注意此時TCP連接還沒有釋放,必須經(jīng)過2 ∗ * ∗MSL(最長報文段壽命)的時間后,當(dāng)客戶端撤銷相應(yīng)的TCB后,才進(jìn)入CLOSED狀態(tài)。

服務(wù)器只要收到了客戶端發(fā)出的確認(rèn),立即進(jìn)入CLOSED狀態(tài)。同樣,撤銷TCB后,就結(jié)束了這次的TCP連接。可以看到,服務(wù)器結(jié)束TCP連接的時間要比客戶端早一些。

四次揮手

為什么客戶端最后還要等待2MSL?

MSL(Maximum Segment Lifetime),TCP允許不同的實現(xiàn)可以設(shè)置不同的MSL值。

第一,保證客戶端發(fā)送的最后一個ACK報文能夠到達(dá)服務(wù)器,因為這個ACK報文可能丟失,站在服務(wù)器的角度看來,我已經(jīng)發(fā)送了FIN+ACK報文請求斷開了,客戶端還沒有給我回應(yīng),應(yīng)該是我發(fā)送的請求斷開報文它沒有收到,于是服務(wù)器又會重新發(fā)送一次,而客戶端就能在這個2MSL時間段內(nèi)收到這個重傳的報文,接著給出回應(yīng)報文,并且會重啟2MSL計時器。

第二,防止類似與“三次握手”中提到了的“已經(jīng)失效的連接請求報文段”出現(xiàn)在本連接中??蛻舳税l(fā)送完最后一個確認(rèn)報文后,在這個2MSL時間中,就可以使本連接持續(xù)的時間內(nèi)所產(chǎn)生的所有報文段都從網(wǎng)絡(luò)中消失。這樣新的連接中不會出現(xiàn)舊連接的請求報文。

為什么建立連接是三次握手,關(guān)閉連接確是四次揮手呢?

建立連接的時候, 服務(wù)器在LISTEN狀態(tài)下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發(fā)送給客戶端。而關(guān)閉連接時,服務(wù)器收到對方的FIN報文時,僅僅表示對方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),而自己也未必全部數(shù)據(jù)都發(fā)送給對方了,所以己方可以立即關(guān)閉,也可以發(fā)送一些數(shù)據(jù)給對方后,再發(fā)送FIN報文給對方來表示同意現(xiàn)在關(guān)閉連接,因此,己方ACK和FIN一般都會分開發(fā)送,從而導(dǎo)致多了一次。

如果已經(jīng)建立了連接,但是客戶端突然出現(xiàn)故障了怎么辦?

TCP還設(shè)有一個?;钣嫊r器,顯然,客戶端如果出現(xiàn)故障,服務(wù)器不能一直等下去,白白浪費資源。服務(wù)器每收到一次客戶端的請求后都會重新復(fù)位這個計時器,時間通常是設(shè)置為2小時,若兩小時還沒有收到客戶端的任何數(shù)據(jù),服務(wù)器就會發(fā)送一個探測報文段,以后每隔75秒發(fā)送一次。若一連發(fā)送10個探測報文仍然沒反應(yīng),服務(wù)器就認(rèn)為客戶端出了故障,接著就關(guān)閉連接。

總結(jié)

這篇文章接到這里了,希望大家能有喜歡,也希望大家可以關(guān)注腳本之家的其他內(nèi)容!

相關(guān)文章

  • Springboot微服務(wù)打包Docker鏡像流程解析

    Springboot微服務(wù)打包Docker鏡像流程解析

    這篇文章主要介紹了Springboot微服務(wù)打包Docker鏡像流程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 詳解java 客戶端鏈接不上redis解決方案

    詳解java 客戶端鏈接不上redis解決方案

    這篇文章主要介紹了詳解java 客戶端鏈接不上redis解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Java微信小程序oss圖片上傳的實現(xiàn)方法

    Java微信小程序oss圖片上傳的實現(xiàn)方法

    這篇文章主要介紹了Java微信小程序oss圖片上傳的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • SpringBoot 整合jdbc和mybatis的方法

    SpringBoot 整合jdbc和mybatis的方法

    該文章主要為記錄如何在SpringBoot項目中整合JDBC和MyBatis,在整合中我會使用簡單的用法和測試用例,感興趣的朋友跟隨小編一起看看吧
    2019-11-11
  • SpringCloud之動態(tài)刷新、重試、服務(wù)化的實現(xiàn)

    SpringCloud之動態(tài)刷新、重試、服務(wù)化的實現(xiàn)

    這篇文章主要介紹了SpringCloud 之動態(tài)刷新、重試、服務(wù)化的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • SpringCloud將Nacos作為配置中心實現(xiàn)流程詳解

    SpringCloud將Nacos作為配置中心實現(xiàn)流程詳解

    這篇文章主要介紹了Springcloud中的Nacos Config服務(wù)配置,本文以用戶微服務(wù)為例,進(jìn)行統(tǒng)一的配置,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • 使用MyBatis攔截器實現(xiàn)SQL的完整打印

    使用MyBatis攔截器實現(xiàn)SQL的完整打印

    當(dāng)我們使用Mybatis結(jié)合Mybatis-plus進(jìn)行開發(fā)時,為了查看執(zhí)行sql的信息通常我們可以通過屬性配置的方式打印出執(zhí)行的sql語句,但這樣的打印出了sql語句常帶有占位符信息,不利于排錯,所以本文介紹了構(gòu)建MyBatis攔截器,實現(xiàn)SQL的完整打印,需要的朋友可以參考下
    2024-07-07
  • SpringData JPA審計功能(@CreatedDate與@LastModifiedDate)實現(xiàn)

    SpringData JPA審計功能(@CreatedDate與@LastModifiedDate)實現(xiàn)

    Spring Data JPA的審計功能提供了一種強(qiáng)大而靈活的機(jī)制,用于自動跟蹤實體的創(chuàng)建和修改信息,通過使用@CreatedDate和@LastModifiedDate注解,開發(fā)者可以輕松地實現(xiàn)時間審計,感興趣的可以了解一下
    2025-04-04
  • 解決ThingsBoard編譯報錯問題:Failure?to?find?org.gradle:gradle-tooling-api:jar:6.3

    解決ThingsBoard編譯報錯問題:Failure?to?find?org.gradle:gradle-too

    這篇文章主要介紹了ThingsBoard編譯報錯:Failure?to?find?org.gradle:gradle-tooling-api:jar:6.3,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • MyBatis配置文件元素示例詳解

    MyBatis配置文件元素示例詳解

    在MyBatis框架的核心配置文件中,<configuration>元素是配置文件的根元素,其他元素都要在<contiguration>元素內(nèi)配置,這篇文章主要介紹了MyBatis配置文件元素,需要的朋友可以參考下
    2023-06-06

最新評論

彭阳县| 东乡族自治县| 抚顺县| 盖州市| 九江市| 五河县| 金山区| 浮山县| 海兴县| 夏河县| 湘乡市| 恩施市| 建阳市| 万荣县| 弥渡县| 商南县| 绵阳市| 晋江市| 澎湖县| 蓝田县| 宜城市| 大连市| 思茅市| 安义县| 临夏市| 石狮市| 庆城县| 都昌县| 福泉市| 沂水县| 华宁县| 二连浩特市| 盖州市| 日照市| 蒲城县| 寿光市| 六枝特区| 宁阳县| 调兵山市| 建始县| 潼南县|