概述

在《网络基础总结(一)》总结了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. Google揭开Mesa的神秘面纱——一个具备跨地域复制和近实时特性的可伸缩数据仓库

    http://www.infoq.com/cn/news/2014/08/google-data-warehouse-mesa Google发表了一篇新的论文,该论文描述了他们内部所使用的一个被称为M ...

  2. 移动App开发基本技术面

    1.UI布局 1.1.熟悉系统布局基本机制和使用方法 2.界面效果 2.1.熟悉系统提供的所有界面组件 2.2.熟悉各种功能界面效果的实现途径 2,3.动画等特殊UI效果的实现机制 3.网络请求 3. ...

  3. phone number

    problem description: you should change the given digits string into possible letter string according ...

  4. 图片与base64的互转

    /// <summary>        /// 把图片转换到文本信息        /// </summary>        /// <param name=&quo ...

  5. idea 整合ssm 启动页404问题

  6. Spring使用 --- 基本概念(一):DI,依赖注入

    Table of Contents 什么是依赖注入 怎样使用 什么时候使用 好处 本文讲述sprint基本概念之一: DI, 即依赖注入. 什么是依赖注入 说类A依赖于类B,最简单的例子是类A有一个类 ...

  7. swagger上传文件并支持jwt认证

    背景 由于swagger不仅提供了自动实现接口文档的说明而且支持页面调试,告别postman等工具,无需开发人员手动写api文档,缩减开发成本得到大家广泛认可 但是由于swagger没有提供上传文件的 ...

  8. android studio 在使用图片的时候会检测图片的合法性

    1.当android studio 在使用png格式的时候,会报一系列的错误,甚至会显示找不到R文件,这是因为Android studio 不支持png格式的图片,检测图片的合法性的时候会报错 解决方 ...

  9. SpringMVC, Spring和Mybatis整合案例一

    一  准备工作 包括:spring(包括springmvc).mybatis.mybatis-spring整合包.数据库驱动.第三方连接池. 二  整合思路 Dao层: 1.SqlMapConfig. ...

  10. SSM-SpringMVC-24:SpringMVC异常高级之自定义异常

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 自定义异常,大家都会,对吧,无非就是继承异常类等操作,很简单,我就不多扯皮了,但是在xml配置文件中有个不同的 ...