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

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

3天内不再提示

详解TCP报文的头部结构

C语言编程学习基地 来源:简书 作者:InsaneLoafer 2022-05-05 15:08 次阅读

简介

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务端保存的一份关于对方的信息,如ip地址、端口号等。TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手建立一个链接,通过四次挥手来关闭一个连接。当一个连接被建立或被终止时,交换的报文段只包含TCP头部,而没有数据。

1. TCP报文的头部结构

在了解TCP连接之前先来了解一下TCP报文的头部结构。

9f235a6a-c858-11ec-bce3-dac502259ad0.jpg

上图中有几个字段需要重点介绍下:

(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。

(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:

ACK:确认序号有效。

FIN:释放一个连接。

PSH:接收方应该尽快将这个报文交给应用层。

RST:重置连接。SYN:发起一个新连接。

URG:紧急指针(urgent pointer)有效。需要注意的是:不要将确认序号ack与标志位中的ACK搞混了。确认方ack=发起方seq+1,两端配对。

2. 三次握手

三次握手的本质是确认通信双方收发数据的能力首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了我的发件能力和他的收件能力是可以的。于是他给我回信,我若收到了,我便知我的发件能力和他的收件能力是可以的,并且他的发件能力和我的收件能力是可以。然而此时他还不知道他的发件能力和我的收件能力到底可不可以,于是我最后回馈一次,他若收到了,他便清楚了他的发件能力和我的收件能力是可以的。这,就是三次握手。

9f40e6fc-c858-11ec-bce3-dac502259ad0.jpg

第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号ISN(比如是100),那客户端向服务端发送的报文段包含SYN标志位(也就是SYN=1),序列号seq=100。

第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号100存起来,并且随机生成一个服务端的起始序列号(比如是300)。然后给客户端回复一段报文,回复报文包含SYN和ACK标志(也就是SYN=1,ACK=1)、序列号seq=300、确认号ack=101(客户端发过来的序列号+1)。

第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=101,于是知道服务端已经收到了序列号为100的那段报文;同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号300给存下来。然后客户端再回复一段报文给服务端,报文包含ACK标志位(ACK=1)、ack=301(服务端序列号+1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次seq就从101开始,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时seq还是101)。当服务端收到报文后发现ACK=1并且ack=301,就知道客户端收到序列号为300的报文了,就这样客户端和服务端通过TCP建立了连接。

3. 四次挥手

四次挥手的目的是关闭一个连接

9f5e94a4-c858-11ec-bce3-dac502259ad0.jpg

比如客户端初始化的序列号ISA=100,服务端初始化的序列号ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。

第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=1101(100+1+1000,其中的1是建立连接时占的一个序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。

第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=1102(客户端FIN报文序列号1101+1)、序列号seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。

第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=1102、序列号seq=2350(2300+50)。

第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=2351、序列号seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。

9f9d2688-c858-11ec-bce3-dac502259ad0.png

4. 常见面试题

为什么TCP连接的时候是3次?2次不可以吗?

因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据,而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。如果是三次握手,即便发生丢包也不会有问题,比如如果第三次握手客户端发的确认ack报文丢失,服务端在一段时间内没有收到确认ack报文的话就会重新进行第二次握手,也就是服务端会重发SYN报文段,客户端收到重发的报文段后会再次给服务端发送确认ack报文。

为什么TCP连接的时候是3次,关闭的时候却是4次?

因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。

为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到了。

原文标题:网络编程:TCP的三次握手与四次挥手

文章出处:【微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

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

    关注

    28

    文章

    881

    浏览量

    40304
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1353

    浏览量

    79064
  • 连接
    +关注

    关注

    2

    文章

    95

    浏览量

    20966

原文标题:网络编程:TCP的三次握手与四次挥手

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PPPoe的报文结构和抓包分析

    PPPoe的头部后面就是PPP的报文了,因为我们需要的是ppp协议中的认证功能,所以自然需要有完整的ppp报文去完成这一部分的功能。
    的头像 发表于 01-02 09:47 3997次阅读
    PPPoe的<b class='flag-5'>报文</b><b class='flag-5'>结构</b>和抓包分析

    一文详解Modbus TCP通信

    MODBUS报文的用途。协议的通用用途是为诸如PLC’s,I/O模块,以及连接其它简单域总线或I/O模块的网关服务的。MODBUS/TCP 使MODBUS_RTU协议运行于以太网,MODBUS TCP
    发表于 12-22 16:06

    LWIP TCP报文基础知识及其LWIP中TCP协议的实现

    接收完成后才将数据递交到应用层。2 TCP 报文结构TCP 报文段依赖 IP 协议进行发送,因此 TC
    发表于 10-18 14:54

    TCP-IP详解_卷3_TCP事务协议,HTTP,NNTP

    TCP-IP详解_卷3_TCP事务协议,HTTP,NNTP和UNIX域协议》
    发表于 03-24 22:42 39次下载

    TCPv1-TCP-IP协议详解-卷1

    TCPv1-TCP-IP详解-卷1.rar I C M P经常被认为是I P层的一个组成部分。它传递差错报文以及其他需要注意的信息。I C M P报文通常被I P层或更高层协议( T
    发表于 03-16 15:12 60次下载

    tcp ip协议详解卷一

    tcp ip协议详解卷一:《TCP/IP详解,卷1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不
    发表于 05-19 12:02 712次下载

    ICMP控制报文协议

    TCP-IP详解卷2 ICMP控制报文协议,学习TCP很好的资料。欢迎下载。
    发表于 05-09 14:13 0次下载

    tcp报文格式详解

    TCP(Transmission ControProtocol)传输控制协议是一种面向连接的、可靠的、基于字节流的传输层协议。TCP报文TCP层传输的数据单元,也称为
    发表于 12-08 11:11 3.3w次阅读
    <b class='flag-5'>tcp</b><b class='flag-5'>报文</b>格式<b class='flag-5'>详解</b>

    ModbusTCP报文详解

    ModbusTCP报文详解是工业控制常用的一种协议,通过对Modbus报文的理解,能很快提升自己的实际应用能力。
    发表于 06-07 15:15 4次下载

    如何解释TCP报文的内容

    TCP协议有着自己的数据包格式,这里把TCP的数据包称为报文段(segment),TCP报文段封装在IP数据报中发送,
    的头像 发表于 08-31 09:12 2773次阅读

    tcp报文段首部的结构分析

    `TCP`报文段如`APR`报文、`IP`数据报一样,也是由`首部`与`数据区域`组成,`TCP首部`内容很丰富,各个字段都有特定的含义,一般来说`
    的头像 发表于 02-14 10:32 2349次阅读
    <b class='flag-5'>tcp</b><b class='flag-5'>报文</b>段首部的<b class='flag-5'>结构</b>分析

    TCP头部格式是什么

    在学习 TCP 连接之前,还要学习一下 TCP 头部格式。因为 TCP 连接建立,需要用 TCP 包来交换和管理数据,下面看一下
    的头像 发表于 10-08 16:45 1654次阅读
    <b class='flag-5'>TCP</b><b class='flag-5'>头部</b>格式是什么

    TCP 协议深度解析

    头部信息,此处是 TCP 协议 Hypertext Transfer Protocol:应用层 HTTP 的信息 网络分层 应用层(Application Layer) 应用层的本质是规定了应用程序之间如何相互传递报文, 以
    的头像 发表于 11-09 11:19 954次阅读
    <b class='flag-5'>TCP</b> 协议深度解析

    CCLink转Modbus TCP网关_MODBUS报文配置

    兴达易控CCLink转Modbus TCP网关是一种功能强大的设备,可实现两个不同通信协议之间的无缝对接。它能够将CCLink协议转换为Modbus TCP协议,并通过报文配置实现灵活的通信设置。兴
    的头像 发表于 11-15 09:05 573次阅读
    CCLink转Modbus <b class='flag-5'>TCP</b>网关_MODBUS<b class='flag-5'>报文</b>配置

    浅谈OSPF的5种报文

    OSPF头部:以下五个报文都会携带OSPF头部
    的头像 发表于 12-21 10:11 925次阅读
    浅谈OSPF的5种<b class='flag-5'>报文</b>