文章目录

  • TCP 三次握手
    • 第一次握手(SYN=1, seq=x)
    • 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1)
    • 第三次握手(ACK=1,ACKnum=y+1)
    • 为什么需要三次握手?两次不行吗?
  • TCP协议四次挥手
    • 第一次挥手(FIN=1,seq=x)
    • 第二次挥手(ACK=1,ACKnum=x+1)
    • 第三次挥手(FIN=1,seq=y)
    • 第四次挥手(ACK=1,ACKnum=y+1)
    • 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
    • 为什么连接的时候是三次握手,关闭的时候却是四次握手?

TCP 三次握手

所谓三次握手(Three-way Handshake),是建立一个TCP连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口建立连接并同步连接双方的序列号和确认号交换窗口大小信息

第一次握手(SYN=1, seq=x)

建立连接,客户端发送连接请求报文段,这是报文首部中的同步位SYN=1,同时选择一个初始序列seq=x,此时,客户端进程进入了SYN-SENT(同步已发送状态)。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。

第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1)

服务器收到客户端的SYN报文段,如果同意连接,则发出确认报文。确认报文中应该ACK=1,SYN=1,确认号ACKnum=x+1;同时,自己还要发送SYN请求信息,SYN=1,为自己初始化一个序列号seq=y,服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时,TCP服务器进程进入SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。

第三次握手(ACK=1,ACKnum=y+1)

客户单收到服务器的SYN+ACK报文段,再次发送确认包(ACK),SYN标志位0,ACK标志位为1,确认号ACKnum = y+1,这个报文段发送完毕以后,客户端和服务器都进入ESTABLISHED(已建立连接)状态,完成TCP三次握手。

为什么需要三次握手?两次不行吗?

为了防止已失效的连接请求报文端突然又传到服务端,因而产生错误。

目的:为了防止第一次握手时的请求报文段,在发送到某个地方由于链路拥堵超时抵达服务器,这时服务器还会响应,向客户端发送确认报文段,而客户端已经超时,所以不会再等下去。而只有客户端及时收到服务器发送的确认报文段,而且及时响应服务器。

具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

TCP协议四次挥手

TCP连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),也叫做改进的三次挥手。客户端或服务器均可主动发起挥手动作。

第一次挥手(FIN=1,seq=x)

主机1(可以是客户端,也可以是服务器),设置seq=x,向主机2发送一个FIN报文段,此时主机1进入FIN_WAIT_1状态,这表示主机1没有数据要发送给主机2了。

第二次挥手(ACK=1,ACKnum=x+1)

主机2收到主机1发送的FIN报文段,向主机1回一个ACK报文段,ACKnum=x+1,主机1进入FIN_WAIT_2状态,主机2告诉主机1,我“同意”你的关闭请求。

第三次挥手(FIN=1,seq=y)

主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态。

第四次挥手(ACK=1,ACKnum=y+1)

主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态,主机2收到主机1的报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那么,主机1也可以关闭连接了,进入CLOSED状态。

为什么要等待2MSL这个固定时间(两个最大段时间周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的ACK,认为服务器端已经正常关闭,遇事自己也关闭连接,进入CLOSED状态。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

  • 按理说四个报文发完,就直接进入CLOSE状态,但是,我们顾虑的是在传输过程中超时或丢失(不可靠)ACK,所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

  • 还有就是,防止类似于“三次握手”中提到的“已经失效的连接请求报文段”出现在本连接中。客户单发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内锁产生的所有报文段都从网络中消失。这样新的连接中就不会出现旧连接的请求报文。

为什么连接的时候是三次握手,关闭的时候却是四次握手?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文是,很可能并不会立即关闭SOCKET,所以只能先回复ACK报文,告诉Client端,“你发的FIN报文我收到了”,只有等到我Server端所有的报文发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

由于TCP协议是全双工的,也就是说客户端和服务器都可以发起断开连接。两边各发起一次断开连接的申请,加上各自的两次确认,看起来就像执行了四次挥手。

TCP协议三次握手及四次挥手相关推荐

  1. 通俗易懂理解TCP协议三次握手和四次挥手及其常见问题

    TCP协议三次握手和四次挥手 三次握手 如果建立连接只需要2次握手,可能会出现的情况 四次挥手 为什么建立连接是三次握手,关闭连接确是四次挥手呢? TIME_WAIT状态有什么作用,为什么主动关闭方没 ...

  2. TCP协议“三次握手“和“四次挥手“

    TCP协议三次握手和四次挥手 为了使数据的传输更为安全,在OSI七层架构的传输层(TCP)定义了需要建立稳定的连接提供安全的交互环境,而三次握手解决了连接的建立. 三次握手过程: 第一次:客户端向服务 ...

  3. TCP协议---三次握手和四次挥手详解 (不看后悔系列)

    目录 TCP协议简介 TCP报头 TCP工作原理 科来解码详解 wireshark解码详解 三次握手和四次挥手 数据包的大致结构 你不知道的三次握手 为什么需要有三次握手? 为啥只有三次握手才能确认双 ...

  4. TCP协议三次握手和四次挥手

    (接上文) 3.5传输层协议(TCP/UDP) 传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程 ...

  5. TCP协议——三次握手与四次挥手

    TCP协议 是一种面向连接的.可靠的.基于字节流的传输层通信协议.面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接.TCP使用的流量控制协议 ...

  6. 白话解说TCP/IP协议三次握手和四次挥手

    白话解说TCP/IP协议三次握手和四次挥手 1.背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 1.1.问题 有时候聊天的过程中,我的 ...

  7. 一文搞懂TCP的三次握手和四次挥手

    目录 1.三次握手 2.四次挥手 3.11种状态名词解析 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开. 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所 ...

  8. 为什么有TCP 的三次握手 和 四次挥手

    由于我们的设备上的通信程序很直接,所以当时没有仔细想过TCP的三次握手和四次挥手这个问题,有的时候自己写的时候 会忘掉这个问题,就是为什么会有三次握手的过程和4次挥手的过程 简单来说就一句话 &quo ...

  9. 了解TCP的三次握手和四次挥手

    了解TCP的三次握手和四次挥手 一.    TCP/IP OSI参考模型 了解TCP的三次握手和四次挥手,我们首先从TCP/IP OSI参考模型说起. OSI(Open System Intercon ...

最新文章

  1. linux启动tomcat不停的触发gc,tomcat的rmi触发的full gc的时间过长的优化
  2. jdbc封装mysql_用Java手动封装JDBC连接池(一)
  3. django admin扩展 相关备忘录
  4. TEGer看过来,他二哥带你去看大世界!
  5. 推荐关注这7个高质量的前端公众号
  6. 【2017年第2期】深度学习在化学信息学中的应用(下)
  7. 有些车已经不能再买了!因为国五排放标准就要来了!
  8. 考研计算机网络,2020计算机专业考研的计算机网络部分知识点
  9. [C#-Util]ObjectPool Prototype
  10. 雷军说马云骗子、柳传志弃投百度、王兴骂滴滴垃圾…14位大佬悔不当初
  11. ios开发人员行为准则_如何成为iOS开发人员
  12. Google搜索技巧大全:101个谷歌搜索技巧推荐
  13. 跟踪综述推荐:目标跟踪40年
  14. java面试题(精选版)
  15. 源中瑞区块链baas平台一站式服务体系
  16. 教你快递查询单号查询物流
  17. 股票的大底部形态,常见几种底部形态详解
  18. GSM和GPRS网络原理的基本思路
  19. jsp 自动倒数_JSP中的倒数计时器
  20. 广东工业大学 Anyviewce C语言 习题七

热门文章

  1. 松下FP系列程序 松下FP系列程序,搭配松下伺服,昆仑通态触摸屏锂电池全自动叠片贴胶机
  2. 三星刷机工具Odin图文刷机教程
  3. Apache 的配置与应用
  4. Memoires 5.0.0 日记本工具
  5. 复试后,欢迎去【王道论坛】分享考研经验
  6. SharePoint 2013(rtm版) 安装与配置
  7. Android app更新模块
  8. 【linux中安装mysql以及使用mysql图形化界面访问数据库】
  9. libreoffice_NASA开源火星探测器,罗马采用LibreOffice,更多新闻
  10. 请TMD别再意淫乔布斯了!