概述

在《网络基础总结(一)》总结了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. Ueditor1.3.6 setContent的一个bug

    Baidu Uedtior这个版本的占位标签为script标签,UE.get("editor")操作初始化编辑器,这个初始化动作似乎是个异步动作,在这个语句之后如果setConte ...

  2. 通过终端使用ssh-keygen免密码登录远程服务器

    使用终端ssh登录远程Linux服务器,每次不输入如密码 原理:使用keygen认证,实现免密码验证即可登录服务器. Linux(包括Mac OS): $ ssh-keygen /*生成密钥*/ $ ...

  3. Python2和Python3的差异

    之前做Spark大数据分析的时候,考虑要做Python的版本升级,对于Python2和Python3的差异做了一个调研,主要对于语法和第三方工具包支持程度进行了比较. 基本语法差异 核心类差异 Pyt ...

  4. vue UI库iview源码解析(2)

    上篇问题 在上篇<iview源码解析(1)>中的index.js 入口文件的源码中有一段代码有点疑惑: /** * 在浏览器环境下默认加载组件 */ // auto install if ...

  5. git merge 撤销与git 回滚

    git merge提交后恢复 http://blog.psjay.com/posts/git-revert-merge-commit/ git回滚 https://www.jianshu.com/p/ ...

  6. java 保留字段volatile、transient、native、synchronized

    1.volatile Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程.当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享 ...

  7. flock SUSE/RHEL

    Util-linux-2.26 Util-linux 软件包其它实用程序.包括处理文件系统.控制台.分区以及消息等工具. 大概编译时间:1.3 SBU 需要磁盘空间:137 MB 6.65.1. FH ...

  8. java中Number类理解

    一般我们使用数字的时候,会使用内置的数据类型,比如int.float.double.但在实际的开发当中,我们有时候会遇到需要使用数字对象,而不是数据类型的时候.为解决这个问题,java为每一种数据类型 ...

  9. jquery 获取jquery对象的标签类型

    //jquery 对象 $("#"+控件id)[0] //查看控件类型  $("#"+控件id)[0].type 实例1: < select id=&qu ...

  10. 小马哥Python知识体系

    从今天起,小马哥每天都发表一篇关于Python的博文,知识范围由Python的0基础,逐渐到项目应用. 目的: 在分享中学习 每天的新博文都会加入到这里成为超链接,方便各位点击查阅. Python基础 ...