概述

在《网络基础总结(一)》总结了TCP建立连接和断开连接的流程,然而TCP协议远比我所了解的复杂得多,我所知的可以说就冰山一角,所总结的也只是纸上谈兵,仅仅只能对TCP有个肤浅的认识,关于TCP协议细节可以推荐读下《TCP/IP 详解 卷1: 协议》,这篇随笔就看下TCP的报文吧。

TCP报文

我们如何区分一台电脑上的不同应用进程?就像我们区分人一样,不同的人给标识不同的名字,偶尔还会遇到重名的,在计算机上重名的现象就禁止发生的,不同的应用进程,区分它们的是不同的端口号,有人占了这个端口运行,就不允许别人使用这个端口,所以不管是UDP协议还是TCP协议中端口号都尤为重要,源端口和目的端口都必不可少的,没有他们计算机不知道把数据发给哪个应用进程。

源端口:源头,发送方计算机上的端口号。

目的端口:接收一方计算机的端口号。

序号:序号,顾名思义,序号就是编号,给每个传输的字节编个号。老大,老二,老三,这样TCP就知道了,哪个应该先来,哪个应该后到,就解决了乱序的问题,在写的第一篇随笔中,用抓包工具给大家展示的三次握手,如果大家有注意可以看到sequence Number总是为0,其实不是这样的,seq的增加是和传输的字节数相关的,抓包工具为了显示更友好,使用相对序号。

确认号:这个就更好理解了,我给你写封信(发包),发出去总要有回信吧,确认一下信收到没,如果没回,我就认为信可能某种原因,丢了(包)。那我就继续发,直到你收到为止。这就解决丢包的问题,所以我们认为TCP是靠谱协议,但对于TCP来说,他面临的网络环境是很复杂的,如果网络状况确实很差,是没有任何有效的保证的,TCP也无能为力,唯一能做的,就是努力的重传。

数据偏移:数据偏移还有个名称也叫首部长度,因为TCP首部是长度可变的,这个报文段到底多长,也就是说指出TCP数据部分在整个TCP报文段的什么位置。

接下来就是一些状态位了,在第一篇随笔中有提过,SYN发起联机,ACK回复,RST重新联机,FIN结束联机等,前文提过TCP协议是双工的,双方要维护连接的状态,这些带状态位包的发送,会引起双方状态的变化。就像现实中,人与人之间,双方不断发出不同信号,两边的关系也会不断变化,个人认为是一个道理的。

窗口:说得专业点,告知发送端这个接收端缓存有多少,控制发送端发送数据的速率,达到流量控制。其实就是通信双方都声明一个窗口,标识出自己能够处理的能力,别丫的发送太快,把接收端撑爆,也别发得太慢,浪费了处理能力。

检验和:这个就有点像我们常见的验证码了,主要是对整个TCP报文段来说,TCP首部和数据在发送端和接收端之间发生任何的改动,接收方检验有差错,这个TCP段就会被直接丢弃。

紧急指针:紧急指针,就要想起我们的标志位UGR,它要配合URG一起使用,意思就是这个紧急指针只有在URG被置位才有用。紧急,紧急,八百里加急,它的作用很明显,TCP知道你要发送紧急数据,TCP会将接下来数据发送中,所有TCP报文段URG标志置位,哪怕你报文段没有紧急数据,这个动作要持续到紧急数据被发送为止。要注意的是紧急数据并不会开辟一条新的连接通道单独发送,依然是随着普通数据一起发送。

选项部分:最长报文大小,接收方或发送方所能接受的最大报文段的长度。通常连接方都在通信的第一个报文段中指明这个选项。

填充:见名知义,选项部分如果不是32位的整数倍,要添加填充位,加入额外的零,保证TCP头是32的整数倍。

数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

参考:https://www.cnblogs.com/feng9exe/p/8058891.html

======================================================

如发现错误,请及时留言,lz及时修改,避免误导后来者。感谢!!!

TCP报文解析的更多相关文章

  1. C#ModBus Tcp 报文解析

    上一篇博客已经完成 C#ModBus Tcp Master的实现 本篇主要对不同的功能码所发出的报文进行解析(包括请求报文及响应报文) 读操作 功能码 0x01 读一组线圈 读取站号为1 从地址12开 ...

  2. TCP连接过程及报文解析

    可能大家都听过TCP建立连接时需要经历三次握手和四次挥手的. 那么具体的握手挥手的过程是怎么样的呢? 这篇文章就通过WireShark抓包来了解TCP连接建立和断开的过程. 实验方法: 写一段简单的代 ...

  3. Tcp/ip 报文解析

    在编写网络程序时,常使用TCP协议.那么一个tcp包到底由哪些东西构成的呢?其实一个TCP包,首先需要通过IP协议承载,而IP报文,又需要通过以太网传送.下面我们来看看几种协议头的构成 一 .Ethe ...

  4. TCP协议解析

    本文摘抄自:http://www.kuqin.com/shuoit/20141018/342719.html 本文描述了TCP协议,首先简单介绍了TCP完成了一些什么功能:介绍了TCP报文格式,以及典 ...

  5. 结合Wireshark捕获分组深入理解TCP/IP协议栈之TCP协议(TCP报文格式+三次握手实例)

    摘要:     本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析. 一.概述     TCP是面向连接的可靠 ...

  6. 报文解析及CRC类

    /// <summary> /// 报文解析转换类 /// </summary> public class DatagramConvert { public static En ...

  7. 计算机网络(8)-----TCP报文段的首部格式

    TCP报文段的首部格式 概述 TCP报文段首部的前20个字节是固定的,因此TCP首部的最小长度是20字节. 源端口和目标端口 各占2个字节,分别写入源端口号和目的端口号. 序列号 占4个字节,表示本报 ...

  8. ISO8583报文解析

    在此只写了一个8583报文的拆包,组包其实也差不多的. 不多说直接上文件, 具体思路过程,在解析类里面写的有. 其中包含了四个文件 8583resp.txt报文 ISO8583medata配置文件 B ...

  9. TCP报文首段格式

    参考:https://www.bilibili.com/video/av9876107?from=search&seid=5217429010533979778 TCP(Transmissio ...

随机推荐

  1. Web开发相关工具收集

    FireFox相关: FireBug/GreaseMonkey/Yslow/WebDeveloperSelenium:Web应用程序测试的工具--  http://seleniumhq.org/  h ...

  2. 关于国际化时报org.springframework.context.NoSuchMessageException错,具体到No message found under code '你的键名' for locale 'zh_CN'.的解决方案

    使用IntelliJ IDEA开发工具解决方案: 总结原因,解决方案: 1,在使用messageSource.getMessage方法时,参数1的键名跟属性文件中键名不一致,比如Controller中 ...

  3. RabbitMQ学习总结

    关于RabbitMQ是什么以及它的概念,不了解的可以先查看一下下面推荐的几篇博客 https://blog.csdn.net/whoamiyang/article/details/54954780 h ...

  4. 下载Github上某个项目的子文件夹和单个文件

    preface Github下的项目可能很大,里面有很多的子文件夹,我们可能只需要使用某个子目录下的资源,可以不用下载完整的repo就能使用. 例如,我想下载这个repo中的字典文件:https:// ...

  5. SSRS 数据源访问Cube 无法创建订阅的解决方法

    SSRS Report 的数据源可以直接放问SSAS 的Cube. 当报表的数据源设置成下图: 这样设置后,report 能够正常访问 Cube 并打开Report. 但是,如果我们需要添加数据驱动的 ...

  6. 基于Cloudera Search设计数据灾备方案

    当实际项目上线到生产环境中,难以避免一些意外情况,如数据丢失.服务器停机等.对于系统的搜索服务来说,当遇到停机的情况意味着在停机这段时间内,用户都不能通过搜索的相关功能进行访问数据,停机意味着将这一段 ...

  7. php获取汉字首字母实例

    在我们实际开发工作中,有时候需要获取输入汉字的首字母,然后存到库中,方便用户搜索相关信息,下面给出php代码,留做备用: //新添加获取汉子首字,首字字母 function pinyin($zh){ ...

  8. HTML学习笔记3:文字和段落

    ①标题标签     <h1></h1> ~ <h6></h6>分别对应字体不同的大小,数字又小到大对应字体由大到小   ②段落     <p> ...

  9. GitHub学习笔记:分支管理

    GitHub对于每个开发版本都需要有一个分支,默认的分支是master往往被大家保留下来作为主分支,分支类似于进程的一个指针,往往在master这个稳定的主干版本上分出一个或多个正在开发的分支版本,开 ...

  10. linux 文件传输 SCP

    SCP :secure copy (remote file copy program) 也是一个基于SSH安全协议的文件传输命令.与sftp不同的是,它只提供主机间的文件传输功能,没有文件管理的功能. ...