在面试时,会经常被问到TCP报文的一些细节,可以说TCP报文是不少企业用来考察面试者对网络的掌握程度的一道题目。

TCP连接作为网络传输的一个环节,是不可或缺的一部分。例如,OSI七层模型的应用层HTTP就是基于TCP连接实现的。

TCP连接的三次握手和四次挥手机制相信是每个后台开发人员耳熟能详的知识点,那么关于TCP的报文细节以及背后的原理是怎么样的呢?TCP是怎样借助报文来实现三次握手和四次挥手呢?笔者通过阅读书本和加上自己的理解。通过本文,来谈谈TCP报文首部以及报文首部背后的原理。

首先先粘上一张TCP报文图

好了,下面介绍一些基础的内容

TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段,一个TCP报文段分首部和数据两部分,其中很关键的就是TCP的报文头,TCP的全部功能都体现在首部中的各个字段中。

TCP报文段首部的前20个字节(上图有标识)是固定的,后面有4n字节(如果有选项最少为4字节)是根据需要添加的选项,所以TCP首部的最小长度是20字节。

1. 源端口号和目的端口号:

各2个字节,分别写入源端口号和目的端口号。端口就是我们熟悉的65536个套接字的端口号,显然,源端口号和目的端口号跟TCP的分用功能有着密切的关系,不同的应用使用不同的端口号,这样就可以互不干扰。而通信的双方的端口号必须相同,才能保证这一条通道是连接畅通的。

2.序列号(32位)

TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都是按顺序编号。整个要传送的字节流的起始序号必须在连接建立时就要设置。首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。例如一个报文段的序号字段值是101,它的长度是100,那么跟在它后面的报文的序号字段值就是从201开始。

3. 确认号(32位)

是期望收到对方下一个报文段的第一个数据字节的序号。例如TCP通信双方分别为A和B,在B正确收到A发送过来的一个报文段,例如就上面的101-200字节,那么B期望的收到下一个报文段就必须是从201开始。于是B在发送A的确认报文段中把确认号设置为201。

说到这里,上面叙述的三次握手机制的实现原理就比较清晰了,TCP连接通过序号和确认号精确地把一定长度的数据段从连接的一端传送到另一端。

4. 数据偏移

因为选项字段部分,数据偏移就显得尤为重要了。因为选项部分报文段的长度是4n,这个长度是不确定的,如果不标记这个报文段的报头长度,就无法确定报文段的数据部分是从哪一个字节开始,这样在解析报文的时候会出现麻烦。数据偏移就是为了解决这个问题而设计的。

5. URG(紧急)

当URG等于1时,表明紧急指针字段有用。它用来告诉系统,这个报文段中有紧急的数据,应该尽快发送。当紧急标志被置1的时候,紧急数据就会被放在本报文段的首部,这样做的好处是,让紧急数据尽快发送到TCP的接收方。例如:在一大段程序通过TCP连接从发送方发往接收方,已经发送了一部分,但由于一些原因,例如发送方发送了像Ctrl+C(通常为中断服务器服务)这类指令的时候,希望接收方尽快收到这样的紧急信号,如果放在数据报的末尾,未免太慢了,因为这两个字符会被放置在接收方缓存的末尾,在所有数据都被处理完毕后才交付到接收方的应用进程。

6. ACK(确认)

这个字段是TCP通信过程比较常见的字段。当ACK=1时,确认号字段才有效,而确认号字段在上文已经说过,是发送端希望接收端下一次发送的数据的序列号。TCP协议规定,当TCP连接建立之后,所有的发送的报文ACK都置为1。也就是说,ACK字段能够辨别TCP连接是否建立成功。如果是一个运维工程师,抓包来分析不同的字段,这个字段应该是再熟悉不过了。

7. PSH(推送)

有时当两个应用进程进行交互式的通信,有时在一段的应用进程希望在输入一个命令的时候得到接收方的响应,这个时候,TCP就可以使用推送操作。接收放收到推送字段置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓冲都填满了再向上交互。但是据说实际上这个字段用得很少,因为TCP本身可以实现这个功能。

8. RST(复位)

当RST = 1时,表明TCP连接中出现了严重错误。例如主机崩溃或者其他原因,必须释放连接。然后在 重新建立运输连接。

9. SYN(同步)

在连接建立时用来进行同步的信号。当SYN = 1而ASK = 0时,表明这是一个连接请求报文。对方若同意建立连接,则在响应的报文段中使SYN = 1 ,ACK = 1。

10 .FIN(终止)

用来释放一个连接,当FIN = 1时,表明此报文段的发送方的数据已经发送完毕,并释放TCP连接,这个字段只有在TCP的四次挥手时候才会被置为1.

11.检验和

检验和字段检验(报文的)范围包括首部和数据两部分。在计算检验和时,都要在TCP报文段的前面添加12字节的伪首部。检验和有什么用?这关系到报文的正确性问题。为了保证TCP连接上传输的数据的正确性,即从发送方传送到接收方没有出现错误,用检验和来确定数据传输过程是否发生了错误。

12.紧急指针

紧急指针在URG = 1时才有意义,它指出本报文段中的紧

转载于:https://www.cnblogs.com/thomson-fred/p/9926689.html

TCP连接之报文首部相关推荐

  1. 我与TCP连接不得不说的故事

    TCP连接 持续连接 缺点 可能会损害服务器的整体性能 需要很多探测包来维持这个连接 优点 减少CPU以及内存的使用 发生错误时,可以在不关闭连接的情况下进行提示 减少网络堵塞,减少了TCP请求 非持 ...

  2. TCP连接中的异常情况

    TCP 保活机制( keepalive)可以在双方没有数据交互的情况,通过探测报文,来确定对方的 TCP 连接是否存活. 无数据交互的情况下的异常[主机崩溃|进程崩溃]: 1在没有开启 TCP kee ...

  3. go 监测tcp 连接断开_TCP三次握手和四次挥手以及11种状态

    三次握手 置位概念:根据TCP的包头字段,存在3个重要的标识ACK.SYN.FIN ACK:表示验证字段 SYN:位数置1,表示建立TCP连接 FIN:位数置1,表示断开TCP连接 三次握手过程说明: ...

  4. 在TCP连接中,如果有一方宕机或者进程崩溃会发生什么?

    当情况为宕机时: 首先是keepalive的影响: 在没有开启 TCP keepalive,且双方一直没有数据交互的情况下,如果客户端的「主机崩溃」了,会发生什么. 客户端主机崩溃了,服务端是无法感知 ...

  5. 5.3 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接---三次握手、tcp连接释放---四次握手)

    文章目录 1.TCP协议特点 2.TCP报文段的首部格式 3.TCP连接管理 (1)连接的建立 - - - 三次握手 (2)SYN泛洪攻击 4.TCP连接释放----四次握手 5.TCP连接建立和释放 ...

  6. 下面是以十六进制格式存储的一个 UDP 首部:~~~TCP连接使用1000字节的窗口值,而上一次的确认号是22001~~那么下一个报文段的序号是否就是 x + 1 呢?在本题中列出的 8 种情况下,画

    5-10 试说明运输层中伪首部的作用 用于计算运输层数据报校验和 5-11 某个应用进程使用运输层的用户数据报UDP,然而继续向下交给IP层后,又封装成IP数据报.既然都是数据报,可否跳过UDP而直接 ...

  7. 【学习笔记】传输层:TCP协议(报文段、连接管理{握手}、可靠传输、流量控制、拥塞控制)

    文章目录 一. 协议特点 & 报文段 ① 特点 ② 报文段首部格式 二. TCP连接管理 ① 建立联系(三次握手) SYN洪泛攻击 ② 连接释放(四次挥手) 三. TCP流量控制 ① 序号 ② ...

  8. TCP连接耗尽攻击异常报文攻击与防御

    TCP连接耗尽攻击与防御 TCP是面向连接的协议,其通信双方必须保持连接状态,并且通过确认.重传.滑动窗口等机制,保证数据传输的可靠性和稳定性.攻击者利用 TCP 的上述特点,利用TCP连接消耗被攻击 ...

  9. MobileIMSDK怎样修改Server端和安卓端TCP连接方式时报文的的限制大小

    场景 MobileIMSDK怎样修改服务端核心jar包的源码并替换掉Java服务端的jar包: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/de ...

最新文章

  1. 报名 | 清华大学大数据能力提升项目开始报名啦!(2021秋)
  2. SpringMVC学习总结(2)——SpringMVC返回json配置
  3. Linux centos openshift安装教程整理
  4. python Anaconda2安装OpenCV2
  5. python爬虫和数据分析电脑推荐_大数据分析必备的5款Python爬虫库
  6. linux下tmp目录属性,Linux:文件夹属性及umask
  7. 【李宏毅机器学习】Semi-supervised Learning 半监督学习(p24) 学习笔记
  8. .net中SessionState相关配置
  9. Hyper-v 2.0
  10. 2021-08-25剑指 Offer 13. 机器人的运动范围
  11. 使用echarts-gl 绘制3D地球配置详解
  12. 长得好看,但没有男朋友是怎样的体验?
  13. 【云原生 • Kubernetes】k8s功能特性、k8s集群架构介绍
  14. 【机器学习线性代数】06 解方程组:从空间的角度再引入
  15. 【笑话】程序员的幽默,你可能看不懂 。。。
  16. ZB雕刻用鼠标和数位板的差别大不大?怎么买手绘板?ZB雕刻手绘是不是很重要?
  17. 【优麒麟】22.04 LTS版本即将发布,终极预告来袭,你准备好了吗?
  18. Subresource Integrity 介绍
  19. 前端Bootstrap框架
  20. QT实现两界面类似QQ聊天

热门文章

  1. 多文档版的的正则表达式工具
  2. 内网用户之间使用MSN Messenger快速传送文件的小窍门
  3. springMvc json 参数
  4. 分析函数RANK的使用
  5. SQLServer之创建辅助XML索引
  6. datatables 获取 pageLength 和 pageStart,重新获取table数据
  7. react redux学习之路
  8. 敏捷与DevOps整合之道
  9. 【LeetCode】405 Convert a Number to Hexadecimal (java实现)
  10. Windows Error Report