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

原创 2016年11月21日 17:03:21

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ACID——MYSQL事务的四个特性

ACID指出每个事务型RDBMS必须遵守四个属性,即原子性、一致性、孤立性、持久性。原子性 原子性意味着事务的整体性和不可分割性,这就类似化学中的原子,是一个不可分割的单元。一个事务可以是一个(任务)...

二叉树按中序遍历顺序转换成双向链表

//首先创建一个可以中序遍历的二叉树结构,并将中序遍历的结果放入List中 package com.dl.tree; import java.util.ArrayList; import...

TCP三次握手-四次挥手详解.doc

  • 2013年03月28日 20:10
  • 92KB
  • 下载

TCP三次握手,四次挥手的过程

  • 2015年09月29日 22:12
  • 69KB
  • 下载

TCP的连接(三次握手)和释放(四次挥手)

三次握手和四次挥手

TCP三次握手四次挥手详解

  • 2011年12月30日 17:03
  • 119KB
  • 下载

TCP连接状态及三次握手四次挥手

TCP一共有11种连接状态: SYN_SENT:在发送连接请求后等待匹配的连接请求(客户端向服务器端发送SYN请求建立一个连接,之后将状态置为SYN_SENT) FIN_WAIT_1:等待远程TCP连...

TCP建立连接(三次握手)和释放(四次挥手)的详细解释

TCP建立连接(三次握手)和释放(四次挥手)的状态图,接下去所有的文字将描述这个图: 在客户端和服务器端还没有建立连接,分别处于closed状态,当要开始建立连接的时候: ①到...
  • wmaoshu
  • wmaoshu
  • 2016年12月06日 16:17
  • 469

TCP连接/撤离中的三次握手与四次挥手过程

相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助.      而且对于有网络协议工...

TCP连接:“三次握手,四次挥手”

TCP运输连接的建立和释放是每一次面向连接的通信中不可少的过程。运输连接有三个阶段:连接建立、数据传输和连接释放。 TCP连接过程建立时解决的三个问题: (1)确保双方都知道对方是存在的。 (2)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈TCP连接的三次握手与四次挥手(2017.08.08修复版)
举报原因:
原因补充:

(最多只允许输入30个字)