浅谈TCP连接的三次握手与四次挥手(2017.08.08修复版)

TCP连接的建立与释放

三次握手(建立TCP连接)

TCP连接建立有如下几个目的,首先,要使双方都知道对方已经准备好了。其次,双方要协商如最大报文长度、最大窗口长度和服务质量等通信参数。第三,分配和初始化如缓存长度,各状态变量和连接表中的表项等运输实体资源。

  • 第一次握手(客户机向服务器发送请求)
    客户机进程向服务器进程发送一个SYN报文段(封装在一个IP数据报中、不包含应用层数据),其首部中的标志SYN比特位被置为1,序号字段中会选择一个起始序号x,即seq=x。

  • 第二次握手(服务器做出请求响应)
    SYN报文段到达服务器后,服务器首先会为该TCP连接分配TCP缓存和变量,并向该客户机TCP发送允许连接的报文段(SYNACK报文段、不包含应用层数据)。该报文段首部设置设置了三个重要信息。首先,首部中的标志SYN和ACK比特位均被置为1。其次该报文段首部的确认号字段被置为x+1,即ack=x+1。最后服务器将自己的序号字段设置为自己的起始序号y,即seq=y。

  • 第三次握手(客户机向服务器发送应用层数据)
    收到SYNACK报文段后,客户机为该连接分配缓存和变量,并向服务器发送第三个报文段,再次对服务器允许连接的报文段进行确认。之后该客户机将确认号字段ack的值置为y+1。这样客户机就可以发送应用层数据了,序号seq=x+1。标志SYN比特位被置为0,标志ACK比特位被置为1。
    这里写图片描述
    以三次握手方式管理TCP连接的优缺点:以三次握手方式管理TCP连接可以更好的避免错误连接,但是这种协议为SYN洪泛攻击提供了可趁之机。在这种攻击中,攻击者大量的发送TCP SYN报文段,但有意不进行第三次握手的步骤,直至服务器消耗完为第一次握手保留的有限资源。(这种攻击为Dos攻击的一种,其目的是使服务器的连接资源迅速的消耗殆尽)。

四次挥手(释放TCP连接)
  • 第一次挥手(客户机释放连接,主机A不再发送数据)
    在数据传输结束后,客户机可以发出一个关闭连接的命令,这会引起客户机向服务器发送一个特殊的TCP报文段,这个报文段首部中的FIN比特位为1,起始序号seq=x。

  • 第二次挥手(通知应用进程对方关闭连接)
    在服务器收到该报文段后,就向客户机回送一个确认报文段,该报文段的ACK比特位置为1,起始序号seq=y,确认号字段ack=x+1。

  • 第三次挥手(服务器释放连接,主机B且不再发送数据)
    服务器可以继续发送它自己的报文段,直至发送最后的报文段并使其FIN比特位置为1,这时,FIN=1,ACK=1,seq=y,ack=x+1。

  • 第四次挥手(连接关闭)
    客户机对服务器的终止报文段进行确认(ACK=1,seq=x+1,ack=y+1),所有资源被释放。
    这里写图片描述
    【修改于2017.08.08(原图第四次挥手有误)】之前放上去的图,最近才发现有问题,错的图不删除了,下面我附上正确的四次挥手的过程图,方便大家作对比,请见谅:
    这里写图片描述

【增加于2017.08.08】本次修改增加三次握手与四次挥手的状态示意图,方便大家对三次握手与四次挥手过程的理解

客户端状态示意图:
这里写图片描述

服务器端状态示意图:
这里写图片描述
客户端在需要请求连接时,向服务器端发送SYN,等收到服务端的ACK确认报文后也向服务器端发送ACK报文,这样就建立了一个TCP连接。
假若客户端发起断开连接的请求(客户端和服务器都可以请求断开连接),客户端会向服务器端发送FIN,也就是告诉服务器端它已经没有数据要发送了,这时候客户端会进入FIN_WAIT状态,这个状态虽然客户端不会向服务器发送数据,但是能接收服务器端发过来的数据并回复确认信息,直到收到服务器端发来的FIN,收到FIN后客户端会回复ACK报文确认并进入TIME_WAIT状态同时启动定时器,如果服务器端没有收到ACK,在定时器到达一定时间后,客户端会进行ACK重传,如果服务器收到ACK,则断开连接,否则客户端在等待2MLS(2倍报文最大生存时间)后,没有收到服务器的重传请求,客户端就认为服务器已经收到ACK,客户端将关闭自己的连接。

参考文献:计算机网络:原理与实践/陈鸣编著.-北京:高等教育出版社,2013.2:222-234

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值