TCP的四次挥手

上文中,我们了解到,当两个进程通过TCP建立了连接,那么最终双方都会进入ESTABLISHED状态.那么下面我们来看看,当TCP关闭连接的时候,Client和Server会发生什么变化.

控制位

终止FIN:用来释放一个连接。当FIN为1时,表明此报文段的发送方的数据已发送完毕,并要求释放传输连接。
确认ACK:仅当ACK=1时确认号字段才有效,当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1。

TCP的连接释放过程

TCP的4次挥手.jpg
  1. 客户端A的应用进程向其TCP发出释放报文段,并停止发送数据,主动关闭TCP连接。同时,A将连接释放报文段首部的终止控制位FIN置为1,然后声明序号seq=u(等于前面已发送过的数据的最后一个字节的序号加1)。这时,A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。TCP规定,FIN报文段即使不携带数据,也消耗一个序号。
  2. B收到连接释放报文段后即发出确认,确认号是ack=u+1,然后声明自己的序号seq=v(等于B前面已传送过的数据的最后一个字节序号+1).随后进入CLOSE-WAIT(关闭等待)状态。随后TCP服务器通知高层应用进程,将A->B这个方向的连接释放,此时,TCP处于半连接的状态(A已经没有数据需要发送了,但是B若发送数据,A仍要接收),此时,B->A这个方向的连接是没有被关闭的,可能会持续一段时间。
  3. A收到来自B的确认后,进入FIN-WAIT2(终止等待2)状态,等待B发出的连接释放报文段。
  4. 若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN=1。经过一段时间的传输后,此时B的seq从v变到了w(假定),然后重复上次已发送的确认号ack=u+1。这时B进入LAST-ACK(最后确认)状态,等待A的确认。
  5. A收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置为1,确认号ack=w+1,自己的序号seq=u+1。然后进入TIME-WAIT(时间等待)状态。此时的TCP连接并没有真正的释放。必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入CLOSED状态。时间MSL(最长报文段寿命,RFC793建议为2分钟,Linux为30S)。假设为2分钟,那么4分钟后A进入CLOSED状态。连接释放。

为什么A在TIME-WAIT状态必须等待2MSL的时间呢?

  1. 为了保证A发送的最后一个ACK报文段能够到达B。这个ACK有可能丢失,因此在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认时,B会进行超时重传这个FIN+ACK报文段,而A就能在2MSL的时间内收到这个重传的FIN+ACK报文段。接着A重传一次ACK报文段,然后刷新2MSL计时器。
  2. 防止“已失效的连接请求报文段”出现在连接释放过程中。A发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段从网络中消失,这样下一个新的连接就不会出现这种旧的连接请求报文段。

为什么需要四次挥手才能断开连接

因为TCP是全双工的,发送方和接收方都需要FIN报文和ACK报文。

服务器出现大量的CLOSE-WAIT的原因

资源没有得到回收,应检查释放资源的代码是否正确执行。
检查线程有关的配置。
Linux中可以通过netstat -n | awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}'查看CLOSE-WAIT数量

为什么建立连接是三次握手,关闭连接却是四次挥手呢?

建立连接的过程中,服务器应答是不需要传送数据的,因此SYN+ACK是一起发送的。但是释放连接的时候,服务器可能要向客户端传送数据,这个动作是需要时间的。因此FIN和ACK需要分开发送。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352