• 【计算机网络】三次握手与四次挥手(过程详解)


    三次握手

    第一次握手:向TCP服务器进程发送TCP连接请求报文段,进入同步已发送状态。TCP连接请求报文段首部中的同步位SYN被设置为1,表明这是一个TCP连接请求报文段,序号字段seq被设置了一个初始值x,作为TCP客户进程所选择的初始序号。

    第二次握手:同意建立连接,则向TCP客户进程发送TCP连接请求确认报文段,进入同步已接收状态。该报文段首部中的同步位SYN和确认位ACK都设置为1,表明这是一个TCP连接请求确认报文段。序号字段被设置了一个初始值y,作为TCP服务器进程所选择的初始序号。确认号字段ack的值被设置成了x + 1

    第三次握手:TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务器进程发送一个普通的TCP确认报文段,并进入连接已建立状态,确认位ACK被设置为1,表明这是一个普通的TCP确认报文段,序号字段seq被设置为x + 1,这是因为TCP客户进程发送的第一个TCP报文段的序号为x;ack为y + 1,这是对TCP服务器进程所选择的初始序号的确认,TCP服务器进程收到该确认报文段后进入连接已建立状态

    9be680c78e31425a8e491f3fbe2311dc.png

    如果改为两次握手会怎样? 

    假如TCP客户进程发出一个TCP连接请求报文段,但该报文段在某些网络结点长时间滞留了。假设重传的报文段被TCP服务器进程正常接收。TCP服务器进程给TCP客户进程发送一个TCP连接请求确认报文段,直接进入连接已建立状态。TCP客户进程收到TCP连接请求确认报文段后,进入连接已建立状态。传输结束后,四次挥手关闭了连接状态。一段时间后,滞留在网络中的那个失效的TCP连接请求报文段到达了TCP服务器进程,TCP服务器进程会误认为这是TCP连接请求又发送的一个新的TCP连接请求,于是给TCP客户进程发送TCP连接请求确认报文段,并进入连接已建立状态,由于TCP客户进程并没有发起新的TCP连接请求,并且处于关闭状态,不会理睬请求,但是服务器进程会一直等待客户进程发来数据,这会浪费TCP服务器进程所在主机的很多资源

    d47107030d59428197691d238dc4194b.png

     四次挥手

    第一次挥手:TCP客户进程会发送TCP连接释放报文段,进入终止等待1状态;报文段首部中的终止位FIN和确认位的ACK的值都被设置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认;序号seq字段的值设置为u,它等于TCP客户进程之前已传送过的、数据的最后一个字节的序号加1.TCP规定终止位FIN等于1的报文段即使不携带数据,也要消耗掉一个序号;确认号ack字段设置为v,它等于TCP客户进程之前已收到的、数据的最后一个字节的序号加1.

    第二次挥手:TCP服务器进程收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段并进入关闭等待状态。确认位ACK的值被设置为1,表明这是一个普通的TCP确认报文段。序号seq字段的值设置为v,它等于TCP服务器进程之前已传送过的数据的最后一个字节的序号加1.确认号ack字段的值设置为u + 1,这是对TCP连接释放报文段的确认。

    这时的TCP连接属于半关闭状态,也就是TCP客户进程已经没有数据要发送了,但TCP服务器进程如果还有数据要发送,TCP客户进程仍要接收,表示从TCP服务器进程到TCP客户进程这个方向的连接并未关闭。这个状态会持续一段时间。

    第三次挥手:TCP服务器进程发送TCP连接释放报文段并进入最后确认状态。该报文段首部中的终止位FIN和确认位ACK的值都被设置为1,表明这是一个TCP连接释放报文段,同时对之前收到的报文段进行确认;现在假定序号seq字段的值为w,这是因为在半关闭状态下,TCP服务器进程可能又发送了一些数据。确认号ack字段的值为u + 1,这是对之前收到的TCP连接释放报文段的重复确认。

    第四次挥手:TCP客户进程收到TCP连接释放报文段后,必须针对该报文段发送普通的TCP确认报文段,之后进入时间等待状态。报文段首部中的确认位ACK的值被设置为1,表明这是一个普通的TCP报文段,序号seq字段的值设置为u + 1,这是因为TCP客户进程之前发送的TCP连接释放报文段虽然不携带数据,但要消耗掉一个序号,确认位ack字段的值设置为w + 1,这是对所收到的TCP连接释放报文段的确认。

    TCP服务器进程收到该报文段后就进入关闭状态,而TCP客户进程还要经过2MSL后才能进入关闭状态,MSL的意思是最长报文段寿命 ,也就是说TCP客户进程进入等待状态后,还要经过4分钟才能进入关闭状态

    93d961844d8e418d9f642b3edcbf9b2d.png

    为什么不直接进入关闭状态?

    假如客户进程传输中的TCP确认报文丢失了,这会造成TCP服务器进程,对之前所发送的TCP连接释放报文段的超市重传,并仍处于最后确认状态,重传的TCP连接释放报文段到达TCP客户进程,由于TCP客户进程关闭状态,不会理会该报文段。这必然会造成TCP服务器进程反复重传TCP连接释放报文段,并一直处于最后确认状态而无法进入关闭状态。因此,时间等待状态以及处于该状态2MSL时长,可以确保TCP服务器进程,可以收到最后一个TCP确认报文段而进入关闭状态。而且2MSL时长可以使本次连接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一次TCP连接中,不会出现旧连接中的报文段。

    439c1b454f7944fd91a87231b346ee13.png

  • 相关阅读:
    前端 html 中的 meta 标签有哪些用处?
    出现了一个全新的编程语言——Mojo
    【leetcode】【剑指offer Ⅱ】064. 神奇的字典
    前端css 纯数字或者字母 溢出不换行
    TensorRt推理部署优化方案及流程概述
    Scala第二十章节
    保姆级教程:Linux (Ubuntu) 部署流光卡片开源 API
    去除有重复的行
    LINUX中命令
    Vue.js 3 应用开发与核心源码解析 阅读笔记
  • 原文地址:https://blog.csdn.net/weixin_60154963/article/details/126824227