国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

網(wǎng)絡(luò)編程-再看TCP的四次揮手

網(wǎng)絡(luò) 通信技術(shù)
作為一種常見的四次揮手場景,我們可能習(xí)以為常了,但需要注意的是,連接的斷開并不只有這種情況,還可以是服務(wù)端發(fā)起主動關(guān)閉,或者雙方同時發(fā)起,但這不是本文關(guān)注的重點(diǎn)。我們直接看看四次揮手有哪些需要注意的。

[[270759]]

前言

四次揮手

四次揮手的流程在很多地方都可以看到,這里簡略介紹一下,其常見流程如下圖所示:

 

其大體流程如下:

  • 客戶端發(fā)其結(jié)束請求,發(fā)送seq=X,處于FIN_WAIT_1狀態(tài)
  • 服務(wù)端收到結(jié)束請求,發(fā)送應(yīng)答ACK=X+1,處于CLOSE_WAIT狀態(tài)
  • 客戶端收到X的應(yīng)答后,處于FIN_WAIT_2狀態(tài),此時還可以接收來自服務(wù)端的數(shù)據(jù)
  • 服務(wù)端沒有數(shù)據(jù)要發(fā)送,也發(fā)送結(jié)束請求,seq=Y,處于LAST_ACK狀態(tài)
  • 客戶端又收到服務(wù)端的結(jié)束請求,客戶端回應(yīng)ACK,此時處于TIME_WAIT狀態(tài),確保ACK能夠到達(dá)服務(wù)端;服務(wù)端收到客戶端最終ACK,關(guān)閉連接。
  • 2MSL時間結(jié)束后,無論服務(wù)端是否收到最終ACK,客戶端完全結(jié)束連接

作為一種常見的四次揮手場景,我們可能習(xí)以為常了,但需要注意的是,連接的斷開并不只有這種情況,還可以是服務(wù)端發(fā)起主動關(guān)閉,或者雙方同時發(fā)起,但這不是本文關(guān)注的重點(diǎn)。我們直接看看四次揮手有哪些需要注意的。

什么是TCP的半關(guān)閉

TCP半關(guān)閉指的是一端結(jié)束發(fā)送后還能夠接受來自另一端的數(shù)據(jù)。也就是說,雖然客戶端準(zhǔn)備斷開連接并且發(fā)送了FIN報文,客戶端還是可以接收來自服務(wù)端的數(shù)據(jù)。不過這種關(guān)閉方式不能使用close接口,而需要使用shutdown:

  1. #include <sys/socket.h> 
  2. int shutdown(int sockfd, int how); 

并且how參數(shù)值為SHUT_WR,即1,表明shutdown for writing ,僅關(guān)閉本端的發(fā)送。

為什么要四次揮手

為什么建立一個TCP連接需要三次握手,而終止一個連接需要四次揮手呢?這是因?yàn)門CP半關(guān)閉造成的。由于一個TCP連接是全雙工的,在兩個方向上都能傳輸數(shù)據(jù),因此兩個方向就需要單獨(dú)關(guān)閉。所以這個流程是這樣的:

  • 客戶端執(zhí)行主動關(guān)閉,發(fā)送FIN報文,告訴服務(wù)端,我沒有數(shù)據(jù)要發(fā)送了,我要關(guān)閉連接,當(dāng)然了,你有啥數(shù)據(jù)要給我,我隨時候著
  • 服務(wù)端收到后,必須及時告訴客戶端我收到了,因此先回復(fù)客戶端一個ACK。但是服務(wù)端可能還有未發(fā)送完的數(shù)據(jù),因此它可以將自己未完成的數(shù)據(jù)進(jìn)行發(fā)送,發(fā)送完成之后,再發(fā)送給客戶端FIN報文,表明我也沒啥要發(fā)送的了,關(guān)閉吧
  • 客戶端收到后,也回復(fù)ACK響應(yīng),最終關(guān)閉連接

因而整個過程需要四次揮手。

為什么要TIME_WAIT狀態(tài)

TIME_WAIT也稱為2MSL等待時間。MSL為報文最大生存時間,它是任何報文在被丟棄前存在于網(wǎng)絡(luò)內(nèi)的最長時間。這個時間在不同類型的系統(tǒng)中可能有所不同,但這不是關(guān)鍵。在我個人的機(jī)器上,可以借助netstat命令和nc命令通過下面的方式觀察到。在終端1監(jiān)聽1234端口:

  1. $ nc -l 1234 

在終端2連接到1234端口:

  1. $ nc 127.0.0.1 1234 

在終端3通過netstat命令觀察:

  1. $ netstat -anpoc|grep :1234 

然后在終端1按ctrl+c,終止連接,立刻觀察終端3的結(jié)果,我們發(fā)現(xiàn):

  1. tcp        0      0 127.0.0.1:1234          127.0.0.1:33524         TIME_WAIT   -                timewait (59.76/0/0) 
  2. tcp        0      0 127.0.0.1:1234          127.0.0.1:33524         TIME_WAIT   -                timewait (58.74/0/0) 
  3. tcp        0      0 127.0.0.1:1234          127.0.0.1:33524         TIME_WAIT   -                timewait (57.71/0/0) 
  4. tcp        0      0 127.0.0.1:1234          127.0.0.1:33524         TIME_WAIT   -                timewait (56.69/0/0) 

我們可以觀察到,服務(wù)端當(dāng)前處于TIME_WAIT,且有一個timewait的定時器,為1分鐘。

netstat命令和nc命令的使用可以分別參考《不可不知的網(wǎng)絡(luò)命令-netstat》和《網(wǎng)絡(luò)工具中的”瑞士軍刀“-nc》。

TIME_WAIT狀態(tài)的存在主要考慮以下兩個方面:

  • 實(shí)現(xiàn)可靠的四次揮手
  • 避免收到老的報文

為什么說TIME_WAIT是為了實(shí)現(xiàn)可靠的四次揮手呢?試想一下,如果客戶端最后回應(yīng)的ACK丟了,那么服務(wù)端會再次發(fā)送FIN報文,此時,客戶端必須處于一個等待狀態(tài),否則服務(wù)端永遠(yuǎn)無法收到這個ACK,而會收到一個RST,以為出錯。而如果客戶端此時處于TIME_WAIT狀態(tài),即等待2MSL時間,它還可以再次回應(yīng)服務(wù)端ACK。這也就保證了可靠的四次揮手。

當(dāng)然了,如果在2MSL時間內(nèi),服務(wù)端還沒有收到,那么對不起,客戶端已經(jīng)仁至義盡了,不會再等待了。

這里需要注意,最終執(zhí)行主動關(guān)閉的那一端會處于TIME_WAIT狀態(tài)。

那么為什么又說是為了避免收到老的重復(fù)報文呢?

試想這樣的場景:

假設(shè)一開始已經(jīng)有一個連接在1234端口建立,我們關(guān)閉這個連接;過一會我們在同樣的ip和端口建立連接,但是TCP必須防止在前一次連接中的老的報文在它原先的連接已終止后,還出現(xiàn)在這個新的連接中,因此,TCP將不允許在處于TIME_WAIT狀態(tài)的ip和端口處建立新的連接。而2MSL時間過后,老的報文早已在網(wǎng)絡(luò)中消失了,也就避免了這種情況的發(fā)生。

這種情況可以很容易通過《網(wǎng)絡(luò)編程-一個簡單的echo程序》的server程序來觀察:

  1. $ ./server  #在一個終端啟動server, 
  2. $ ./client 127.0.0.1 1234 #在另一個終端啟動client 

在服務(wù)端終端ctrl+c終止服務(wù)端,然后再次啟動server:

  1. $ ./server 
  2. bind error: Address already in use 
  3. $ netstat -anop|grep :1234 
  4. tcp        1      0 127.0.0.1:33722         127.0.0.1:1234          CLOSE_WAIT  11691/client     off (0.00/0/0) 
  5. tcp        0      0 127.0.0.1:1234          127.0.0.1:33722         FIN_WAIT2   -                timewait (57.92/0/0) 

終止服務(wù)端后,服務(wù)端處于TIME_WAIT狀態(tài),此時再次啟動server,將不能使用原來的ip和端口建立連接,因此出現(xiàn)Address already in use的報錯。

但是需要注意:

  • 由于客戶端通常使用的是臨時端口(仔細(xì)觀察會發(fā)現(xiàn),客戶端每次啟動使用的端口基本都不一樣),因此客戶端即便處于TIME_WAIT狀態(tài),也不影響它馬上再次啟動
  • 一些實(shí)現(xiàn)允許一個新的連接請求仍然處于TIME_WAIT狀態(tài)的連接,只要新的seq大于該連接的前一個連接的最后序號
  • 通過設(shè)置選項(xiàng)SO_REUSEADDR,可以讓一個進(jìn)程重新使用仍處于TIME_WAIT狀態(tài)的socket

半打開的TCP連接

假設(shè)一個連接建立之后,突然有一方異常終止連接了,但是另一個不知道,這個時候TCP的連接就是半打開的。如果服務(wù)端不加處理,那么最終就會導(dǎo)致服務(wù)端有大量的半打開連接。那么服務(wù)端如何知道客戶端的連接已經(jīng)異常終止了呢?如果等待服務(wù)端發(fā)送數(shù)據(jù)出錯時發(fā)現(xiàn),那么這個時候可能已經(jīng)太晚了。

幸運(yùn)的是,TCP有保活定時器。即服務(wù)端可以通過設(shè)置保活選項(xiàng)來了解客戶端是否已經(jīng)終止連接。

通過下面的方式可以看到很多連接有這樣的定時器:

  1. $ netstat -npo|grep keepalive 
  2. tcp        0      0 192.168.0.103:50832     59.111.179.136:443      ESTABLISHED 5882/chrome      keepalive (37.33/0/0) 
  3. tcp        0      0 192.168.0.103:50638     154.8.131.191:443       ESTABLISHED 5882/chrome      keepalive (0.00/0/0) 
  4. tcp        0      0 192.168.0.103:59330     203.107.41.32:9026      ESTABLISHED 5882/chrome      keepalive (0.35/0/0) 
  5. tcp        0      0 127.0.0.1:45632         127.0.0.1:1080          ESTABLISHED 5886/firefox     keepalive (335.28/0/0) 
  6. tcp        0      0 192.168.0.103:49940     59.56.78.189:443        ESTABLISHED 5882/chrome      keepalive (26.36/0/0) 

但可惜的是,這樣的定時器時間太長了,并且它不能代表應(yīng)用程序能夠正常工作,能夠正常收發(fā)數(shù)據(jù),因此應(yīng)用層常常也會實(shí)現(xiàn)一個心跳機(jī)制。

總結(jié)

本文花了大量篇幅介紹了TIME_WAIT狀態(tài),這也是面試中常問的問題,重新梳理TCP的四次揮手是很有必要的。

責(zé)任編輯:武曉燕 來源: 編程珠璣
相關(guān)推薦

2021-10-14 20:33:16

TCP連接關(guān)閉

2024-07-11 10:55:27

2015-10-13 09:42:52

TCP網(wǎng)絡(luò)協(xié)議

2024-01-12 08:23:11

TCPACK服務(wù)器

2023-10-24 15:22:09

TCPUDP

2022-08-05 11:03:59

TCP 四次揮手三次握手

2019-06-12 11:26:37

TCP三次握手四次揮手

2021-01-29 06:11:08

TCP通信三次握手

2021-05-18 12:27:40

TCP控制協(xié)議

2023-09-02 22:02:58

TCP協(xié)議四次揮手

2020-02-17 10:10:43

TCP三次握手四次揮手

2021-07-03 17:47:25

TCP控制協(xié)議

2017-09-25 21:27:07

TCP協(xié)議數(shù)據(jù)鏈

2019-02-01 09:38:16

2014-09-19 09:46:46

TCPIP

2020-06-29 14:50:47

TCP狀態(tài)ACK

2021-05-28 09:08:20

TCP連接序列號

2025-05-20 08:38:03

2023-10-28 09:07:57

TCP面試三次握手

2015-11-09 09:58:56

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

久久成人精品电影| av国产在线观看| 视频三区在线观看| 免费av成人在线| 久久精品91久久久久久再现| 亚洲综合色视频在线观看| 另类中文字幕网| 色婷婷激情一区二区三区| 春日野结衣av| 成人激情动漫在线观看| 丰满女人性猛交| 日韩高清不卡在线| 精品久久久久久一区二区里番| 亚洲超碰在线观看| 欧美成人vps| h视频在线免费| 91黄色免费观看| www污污在线| 国产偷国产偷精品高清尤物| 一区二区三区四区欧美| 亚洲成人五区| 日韩一区二区三区xxxx| www.精品| 久久久久久久国产精品视频| 成人高潮视频| 日本精品久久久| 外国成人激情视频| 91久久国产精品91久久性色| 亚洲五月综合| 国产精品久久成人免费观看| 国产精品自拍一区| 国产精品无码免费专区午夜| 91免费版在线看| 超碰在线免费| 69堂国产成人免费视频| 欧美在线观看视频一区| 成人黄色免费电影| 久久精品视频一| 国产在线视频一区二区三区| 伦理在线一区| 综合国产精品久久久| 欧美日韩国产首页在线观看| 婷婷综合亚洲| 在线观看导航| 国产综合香蕉五月婷在线| 欧美国产日韩精品免费观看| www.久久爱.com| 久久综合九色99| 亚洲一区二区三区激情| 欧美96在线| 国产一区二区三区在线| 色综合蜜月久久综合网| 日韩精品在线视频免费观看| 欧美亚洲动漫精品| 欧美交a欧美精品喷水| 明星裸体视频一区二区| 91首页免费视频| 男女在线视频| 国产精品久久久久av福利动漫| 久久久av毛片精品| 金瓶狂野欧美性猛交xxxx| 亚洲国产精品一区二区尤物区| 欧美va在线观看| 蜜桃成人在线| 精品久久在线播放| 青青草91久久久久久久久| 黄色手机在线视频| 欧美精品免费看| 91麻豆精东视频| 成人性生活av| av磁力番号网| 亚洲国产成人精品女人久久久| 日韩免费视频| 久草在线官网| 亚洲精品一二区| 美女一区二区视频| 岛国毛片av在线| 手机看片福利盒子久久| 成人免费观看网址| 日韩欧美国产午夜精品| thepron国产精品| 波多野结衣在线观看一区二区| 尤物网在线观看| 波多野结衣综合网| 国产在线久久久| 日韩欧美色电影| 日本一区二区在线不卡| 麻豆成人在线| 日韩欧美黄色| 嗯~啊~轻一点视频日本在线观看| 丝袜老师办公室里做好紧好爽| 国产成人av一区二区三区| 色一区av在线| 日韩欧美中文字幕公布| 国产精品高清亚洲| 日本女优在线视频一区二区| 成人欧美大片| 成 年 人 黄 色 大 片大 全| 在线a欧美视频| 国产精品毛片av| 青青草国产免费| 久久视频免费在线播放| 美国十次了思思久久精品导航 | 欧美日韩另类在线| 日韩精品丝袜美腿| 全部免费毛片在线播放网站| 日韩视频在线观看视频| 亚洲高清精品中出| 亚洲一区二区三区777| 日本久久久久久久久| 欧美亚洲国产一区二区三区va| 日韩电影免费网址| 久热精品在线播放| 日韩免费福利电影在线观看| 99tv成人影院| 樱空桃在线播放| 国产不卡av在线| 日韩在线观看免费| 亚洲国产欧美一区二区三区同亚洲| 91麻豆精品国产91久久久 | 毛片在线网址| 亚洲在线不卡| 国产精品三区在线| 亚洲精品国产免费| 看国产成人h片视频| 欧美xo影院| aaa在线播放视频| 成人在线观看视频网站| 亚洲午夜日本在线观看| 激情欧美一区二区| 麻豆mv在线看| 91香蕉国产在线观看| 亚洲精品天天看| 欧美综合亚洲图片综合区| 久久高清一区| 国产韩国精品一区二区三区| 凹凸成人在线| 久本草在线中文字幕亚洲| 国产在线播放精品| 中文精品久久| 久久综合中文| 免费亚洲婷婷| 91成人在线精品视频| 成人片在线播放| 看一级黄色录像| 国产一区二区在线网站| 亚洲一区三区电影在线观看| 成人在线视频一区二区三区| 99视频在线免费播放| 日韩在线视频在线| 成人av在线天堂| zzjj国产精品一区二区| 91久久精品午夜一区二区| 国产视频一区二区在线| 国产精品地址| 一本色道久久综合亚洲精品高清| 精品久久久亚洲| 欧美另类老肥妇| www在线视频| av在线下载| 黄色国产在线| 久久国产成人精品国产成人亚洲 | 久久免费黄色| 丁香一区二区| av最新在线| av免费看在线| 成人免费在线| 欧美成熟毛茸茸| 快播av资源| 一区二区传媒有限公司| 国产成人在线一区| 91免费国产网站| 精品在线一区| 欧美污视频网站| 涩涩av在线| 九九九久久久精品| 欧美日韩国产激情| 欧美中文一区二区三区| 久久久久国产精品www| 国产伦精品一区二区三区高清版| 欧美一区二区在线视频观看| 樱空桃在线播放| 黄色国产小视频| 夜级特黄日本大片_在线 | 超碰电影在线播放| 一级毛片高清视频| 一区二区不卡在线观看| 亚洲第一狼人区| 激情综合色综合啪啪开心| 神马电影久久| 4438全国亚洲精品观看视频| 日本久久一区| 日韩另类视频| 欧美xxxx在线| 国产精品日本| 老司机久久99久久精品播放免费| 精品综合免费视频观看| 中文字幕av在线一区二区三区| 日韩女优av电影在线观看| 色偷偷av亚洲男人的天堂|