0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

TCP三次握手与四次挥手的细节理解

GReq_mcu168 来源:码农爱学习 作者:码农爱学习 2021-03-25 14:11 次阅读

简介

TCP提供面向有连接的通信传输,面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。

TCP在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答(TCP中发送第一个SYN包的一方叫做客户端,接收这个的一方叫做服务端)。如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答未能到达,就不会进行数据通信。此外,在通信结束时会进行断开连接的处理(FIN包)。

一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成(建立一个TCP连接需要发送3个包,这个过程也称作“三次握手”,断开一个TCP连接需要发送4个包,这个过程也称作“四次挥手”)。

af0d6c02-8cec-11eb-8b86-12bb97331649.png

TCP报文段首部

在具体理解三次握手与四次挥手的细节时,需要先了解一下TCP报文段的首部格式:

af854cd6-8cec-11eb-8b86-12bb97331649.jpg

主要需要了解的是:

序号 seq

占4个字节,范围[0,223-1],共223(42 9496 7296)个序号。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。

确认号 ack

占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。

确认 ACK

仅当ACK=1时确认号字段才有效,当ACK=0时,确认号无效。TCP规定,在建立连接后所传送的报文都必须把ACK置1。

同步 SYN

在连接时用来同步序号,当SYN=1而ACK=0时,表明这是一个连接请求报文段,对方若同意连接,在应在响应的报文段中使用SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。

终止 FIN

用来释放一个连接,当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

三次握手

afdd4238-8cec-11eb-8b86-12bb97331649.jpg

最初两端的TCP进程都处于CLOSE(关闭)状态。上图中A主动打开连接,B被动打开连接。

B打开连接后处于LISTEN(监听状态),等待客户的连接请求。

A向B发送请求报文,SYN=1,ACK=0,选择一个初始序号seq=x。

B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为ack= x+1,同时也选择一个初始的序号 seq=y。

A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为ack= y+1,序号为 seq=x+1。

B 收到 A 的确认后,连接建立。

必须握手三次而不是两次的原因

主要是防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

建立连接后,客户端出现故障时的机制

TCP设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若2小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

四次挥手

b055125e-8cec-11eb-8b86-12bb97331649.jpg

A 发送连接释放报文,FIN=1。

B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。

当 B 不再需要连接时,发送连接释放报文,FIN=1。

A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。

B 收到 A 的确认后释放连接。

四次挥手的细节

CLOSE-WAIT

客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。

TIME-WAIT

客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。原因有二:

为保证A发送的最后一个ACK报文段能够到达B

A发送的这个ACK报文段有可能丢失,如果 B 没收到 A 发送来的确认报文,那么A就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。

防止“已经失效的连接请求报文段”出现在本链接中

A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接的时间内所产生的所有报文段都从网络中消失。这样下一个新的连接中就不会出现这种旧的连接请求报文段。

为何建立连接协议是三次握手,而关闭连接却是四次挥手?

因为服务端B的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当B收到对方A的FIN报文通知时,它仅表示客户端A没有数据发送给B了;但未必B的数据都全部发送给A了,所以B可能未必会马上会关闭SOCKET,而是先发送一个ACK应答信号,继续将剩余的数据发送给A之后,再发送FIN报文给A表示B同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

原文标题:TCP的三次握手与四次挥手

文章出处:【微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信
    +关注

    关注

    18

    文章

    5706

    浏览量

    134389
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1271

    浏览量

    78290

原文标题:TCP的三次握手与四次挥手

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    说说TCP三次握手的过程?为什么是三次而不是两次、四次

    说说TCP三次握手的过程?为什么是三次而不是两次、四次TCP
    的头像 发表于 02-04 11:03 226次阅读

    TCP协议连接的三次握手

    通过三次握手,客户端与服务端能够确保彼此的网络连接是可用的。客户端发起的SYN报文和服务端返回的SYN+ACK报文都包含了对方的初始序列号和通信能力信息,通过互相确认这些信息,双方确认彼此的能力和正确性。
    的头像 发表于 02-03 16:44 877次阅读
    <b class='flag-5'>TCP</b>协议连接的<b class='flag-5'>三次</b><b class='flag-5'>握手</b>

    TCP和UDP协议有什么区别?如何通过网关实现TCP协议通信?

    ,而四次握手就是指断开的过程。而UDP可以立即传输数据,并不需要建立三次握手连接。两者相比,TCP就像是挂了专家号,可以保证及时看病;而UD
    的头像 发表于 01-24 11:07 233次阅读
    <b class='flag-5'>TCP</b>和UDP协议有什么区别?如何通过网关实现<b class='flag-5'>TCP</b>协议通信?

    请问SPI DMA描述符列表如何单触发?

    第一 按照描述符元素0的配置信息进行触发; 手动第二 按照描述符元素1的配置信息进行触发; 手动第三次 按照描述符元素2的配置信息进行触发; 手动第四次 按照描述符元素0的配置信
    发表于 01-12 08:07

    浅谈TCP三次握手四次挥手

    在计算机网络的基本概念中,分层次的体系结构是最基本的。计算机网络体系结构的抽象概念较多,在学习时要多思考。这些概念对后面的学习很有帮助。
    的头像 发表于 01-03 13:40 479次阅读
    浅谈<b class='flag-5'>TCP</b><b class='flag-5'>三次</b><b class='flag-5'>握手</b>和<b class='flag-5'>四次</b><b class='flag-5'>挥手</b>

    使用ARM对ADIS16480进行SPI数据读取时,需要发送三次读取指令才能读取到数据是为什么?

    使用ARM对ADIS16480进行SPI数据读取时,需要发送三次读取指令,第三次才能读到第一发送读取数据指令所读到的数据,请问有人知道这个是什么地方配置出错还是什么别的原因
    发表于 12-28 07:26

    关于TCP协议总结的硬核干货

    本文给出TCP报文格式的详细说明,介绍网络数据包传递中如何进行地址解析、建立TCP连接的三次握手过程以及断开TCP连接的
    发表于 11-17 09:26 235次阅读
    关于<b class='flag-5'>TCP</b>协议总结的硬核干货

    TCP通信过程详解

    握手的,而释放则需要4次挥手,所以说每个连接的建立都是需要资源消耗和时间消耗的 经典的三次握手示意图: 经典的四次
    的头像 发表于 11-09 14:39 411次阅读
    <b class='flag-5'>TCP</b>通信过程详解

    TCP三次握手的理论知识

    关于TCP三次握手的理论知识,往上一搜一大片,本文就跳过理论,直接上手。Let’s go。 准备知识 抓一个TCP三次
    的头像 发表于 11-09 11:27 315次阅读
    <b class='flag-5'>TCP</b><b class='flag-5'>三次</b><b class='flag-5'>握手</b>的理论知识

    TCP协议详细解析

    TCPTCP/IP协议族中一个最核心的协议,它向下使用网络层IP协议,向上为应用层HTTP、FTP、SMTP、POP3、SSH、Telnet等协议提供支持。本文给出TCP报文格式的详细说明,介绍网络数据包传递中如何进行地址解析
    的头像 发表于 11-03 09:14 1697次阅读
    <b class='flag-5'>TCP</b>协议详细解析

    TCP连接的建立与中止

    常重要的 。 TCP 连接的建立可以简单地称为三次握手,而连接的中止则可以称为四次挥手。 建立连接 TC
    的头像 发表于 10-08 16:52 455次阅读

    TCP协议如何优化

    TCP/IP协议经常在面试中会被问到,基础的会问三次握手四次挥手,更深一点可能会问TCP如何优
    的头像 发表于 10-08 15:15 829次阅读
    <b class='flag-5'>TCP</b>协议如何优化

    TCP和UDP分别是什么 tcp三次握手和4次挥手的过程

    TCP,即传输控制协议(Transmission Control Protocol),面向连接、可靠传输的协议,能保证数据的可靠性、有序性和完整性,常用于大文件的上传或下载、电子邮件、网页浏览
    的头像 发表于 09-29 15:51 556次阅读

    TCP/IP三次握手四次挥手讲解

    第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
    发表于 08-22 09:42 214次阅读
    <b class='flag-5'>TCP</b>/IP<b class='flag-5'>三次</b><b class='flag-5'>握手</b>与<b class='flag-5'>四次</b><b class='flag-5'>挥手</b>讲解

    什么是TCP连接的三次握手

    为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP
    发表于 05-04 15:30 1049次阅读