TCP/IP 三次握手建立连接和四次挥手释放连接

1. TCP 连接的建立

这里写图片描述

设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接受客户端进程的连续请求,然后服务进程就处于监听状态,不断检测是否有客户进程发起连续请求,如果有,做出响应。

设客户进程运行在主机A上,先向自己的TCP发出主动打开的命令,表明要向某个IP地址的某个端口建立运输连接

1) 主机A的TCP向主机B的TCP发出连接请求报文段,首部的同步为SYN置为1,并选择一个序列号X,表示后面要传输的第一个数据字节的序号是X。发送之后进入SYN_SENT状态

2)主机B接受到该请求报文段,如果确认建立连接,就向客户端发送一个确认报文段,置首部的同步位SYN为1,确认号为X+1,并自己选一个序列号Y,发送之后进入SYN_RCVD状态

3) 客户端收到该确认报文段,还要给服务器继续发送确认报文段,确认号为y+1,并且进入ESTABLISHED状态

4) 服务端收到确认报文段后进入ESTABLISHED状态,双方通知上层应用进程里连接已经建立,开始传输数据

2.TCP连接的释放

这里写图片描述

1) 客户端A的应用进程通知TCP要终止连接,并且不再传输数据。客户端A通知服务器B要释放连接,发送的TCP报文段的首部终止比特位FIN置为1,序列号seq为传输的最后一个字节的序号+1 发送之后进入FIN_WAIT-1状态

2) 服务端B收到该请求后,发出确认,确认报文段的确认号为u+1,并选择一个序列号V。通知上层应用A到B的连接需要释放,连接处于半关闭状态,即服务器B不再接受来自客户端A的数据,但是还是需要向A发送数据,如果A正确接受仍需要发送确认。此时的状态是CLOSE_WAIT

3) 此时客户端处于FIN_WAIT-2状态 在接受服务端发送的剩余数据。

3) 服务器B发送完数据后,应用程序就开始等待TCP释放连接。此时服务器B向客户端发送连接释放报文段,首部的终止位FIN置为1,确定号仍然是u+1,并且就选择一个序列号w,进入LAST_ACK状态

4) 客户端A接受到该报文段后,向服务端发送确认报文段,确认号是w+1,序列号仍然是u+1,进入TIME_WAIT状态。这样才把B到A的反方向连接释放掉。等待2MSL关闭TCP连接

5) 服务器B收到确认报文段后关闭TCP连接

3.重点

  • 三次握手建立连接时,发送方再次发送确认的必要性

    • 为了防止已失效的连接请求又传送到B
      假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,一直延迟到连接释放以后的某个时间才到达B,本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了,这样一直等待A发来数据,B的许多资源就这样白白浪费了
  • 四次挥手释放连接时,等待2MSL的意义

    • 1.为了保证A发送的最后一个ACK报文能到达B
      这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN和ACK报文段的确认。B会超时重传这个FIN和ACK报文段,而A就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着A重传一次确认。
    • 2.防止已失效的连接请求报文段出现在本次连接中
      A在发送完最有一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失

4.TCP的有穷状态机

连接的建立和释放所要求的步骤可以用一个有限状态机来表达,该状态机有11种状态。每一种状态中都存在一些合法的事件,当合法事件发生的时候,可能需要采取某个动作。当其他事件发生的时候,则报告一个错误。

状态描述
CLOSED关闭状态,没有连接活动或正在运行
LISTEN监听状态,服务器正在等待连接进入
SYN SENT已经发送连接请求 等待确认
SYN RCVD收到一个连接请求 尚未确认
ESTABLISHED建立连接 正常数据传输状态
FIN_WAIT 1(主动关闭) 已经发送关闭请求 等待确认
CLOSE WAIT(被动关闭) 收到对方关闭请求 已经确认
FIN_WAIT 2(主动关闭) 收到对方关闭确认 等待对方关闭请求
LAST ACK(被动关闭) 等待最后一个关闭确认 并等待所有分组死掉
TIME_WAITED完成双向关闭 等待所有文组死掉
CLOSING双方同时尝试关闭 等待对方确认

这里写图片描述

  • 客户进程变迁的过程(粗实线)

    • 连接建立:设一个主机的客户进程发起连接请求(主动打开),这时本地TCP实体就创建传输控制快(TCB),发送一个SYN为1的报文,进入SYN_SENT状态。当收到来自进程的SYN和ACK时,TCP就发送出三次握手中的最后一个ACK,进而进入连接已经建立的状态ESTABLISHED。
    • 连接释放:设运行客户进程主机本地TCP实体发送一个FIN置为1的报文,等待着确认ACK的到达,此时状态变为FIN_WAIT_1。当运行客户进程主机收到确认ACK时,则一个方向的连接已经关闭。状态变成FIN_WAIT_2。当运行客户进程的主机收到运行服务器进程的主机发送的FIN置为1的报文后,应响应确认ACK时,这是另一个连接关闭。但此时TCP还要等待一段时间后才删除原来建立的连接记录。返回到初始的CLOSED状态,这是为了保证原来连接上的所有分组都从网络中消失了。
  • 服务器进程变迁的过程(粗虚线)

    • 连接建立:服务器进程发出被动打开,进入监听状态LISTEN。当收到SYN置为1的连接请求报文后,发送确认ACK,并且报文中的SYN也置为1,然后进入SYN_RCVD状态。在收到三次握手最后一个确认ACK时,就转为ESTABLISHED状态。
    • 连接释放:当客户进程的数据已经传送完毕。就发出FIN置为1的报文给服务器进程,进入CLOSE_WAIT状态。服务器进程发送FIN报文段给客户进程,状态变为LAST_ACK状态。当收到客户进程的ACK时,服务器进程就释放连接。删除连接记录。回到原来的CLOSED状态。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值