Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Tcp/ip 报文解析

Tcp/ip 报文解析

作者头像
发布于 2018-01-17 01:57:05
发布于 2018-01-17 01:57:05
3.3K0
举报
文章被收录于专栏:

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

一 .Ethernet头

以太帧分好几种类型,常见的以太帧为Ethernet II

下面就是一个典型的Ethernet II帧

Ethernet II类型以太网帧的最小长度为64字节(6+6+2+46+4),最大长度为1518字节(6+6+2+1500+4)

首先是目的MAC 6个字节,然后源MAC6个字节,接下来数据类型两个字节。

常见的类型如下

IPv4: 0x0800

ARP:0x0806

PPPoE:0x8864

802.1Q tag: 0x8100

IPV6: 0x86DD

MPLS Label:0x8847

然后是数据长度,46-1500字节。对于不定长的数据包,帧最后还有4个字节的FCS(Frame check sequence)

下面是一个以太帧头示例,该报文类型为IPv4(0x8000)

二 IP头部

对于一个IPv4类型的以太帧,数据的开始就是IP头部。一般IPv4的头部是20个字节。

版本号(Version):4bit。表明IP协议的版本号。一般为0100(IPv4),0110(IPv6)

IP包头长度(Header Length):4bit。用于描述IP包头长度,因为IP包头长度是可变的。

这里所指示的长度,是以4个字节为一个单位。例如,一个IP包头的长度最长为“1111”,即15*4=60个字节。IP包头最小长度为20字节。

服务类型(Type of Service):长度8比特。 IP包总长(Total Length):16bit。 以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。 标识符(Identifier):16bit。该字段和Flags和Fragment Offest字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。

标记(Flags):3bit。第一位是保留位不使用。第二位是DF(Don't Fragment)位,DF位设为1时表明路由器不能对该数据包分包。如果一个数据包无法在不分段的情况下发送,则路由器会丢弃该数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。

片偏移(Fragment Offset):13bit。表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。

生存时间(TTL):8bit。当IP包在网络上传送时,每经过一个路由器,TTL就自动减一。值为0时,则丢弃报文。防止报文进入环路

协议(Protocol):8bit。标识IP头后面的报文协议类型 以下是比较常用的协议号:

1    ICMP

2    IGMP

6    TCP

17    UDP

88    IGRP

89    OSPF

头校验和(Header Checksum):16bit。用来做IP头部的正确性检测,但不包含数据部分。由于路由器会改变TTL,所以路由器会为每个通过的数据包重新计算这个值。

源和目的地址(Source and Destination Addresses):这两个地段都是32比特。标识了这个IP包的起源和目标地址。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。

下图就是一个IP头的内容

三 TCP 头部

TCP封装在IP报文中的时候,如下图所示,TCP头紧接着IP头(IPV6有扩展头的时候,则TCP头在扩展头后面),不携带选项(option)的TCP头长为20bytes,携带选项的TCP头最长可到60bytes。

源端口(Source Port):16bit, 表示报文发送方的端口号

目的端口(Destination port): 16bit,表示报文接收方的端口号

序列号(SN):32bit,标识了TCP报文中第一个byte在对应方向的传输中对应的字节序号。当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1,单位是byte。比如发送端发送的一个TCP包净荷(不包含TCP头)为12byte,SN为5,则发送端接着发送的下一个数据包的时候,SN应该设置为5+12=17。通过系列号,TCP接收端可以识别出重复接收到的TCP包,从而丢弃重复包,同时对于乱序数据包也可以依靠系列号进行重排序,进而对高层提供有序的数据流。另外SYN标志和FIN标志在逻辑上也占用一个byte,当SYN标志位有效的时候,该字段也称为ISN(initial sequence number),详细请参考后续的TCP连接管理。

应答号(ACK):32bit,标识了报文发送端期望接收的字节序列。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码,注意是准备接收的包,比如当前接收端接收到一个净荷为12byte的数据包,SN为5,则发送端可能会回复一个确认收到的数据包,如果这个数据包之前的数据也都已经收到了,这个数据包中的ACK Number则设置为12+5=17,表示17byte之前的数据都已经收到了。在举一个例子,如果在这个数据包之前有个SN为3,净荷为2byte的数据包丢失,则在接受端接收到这个SN为5的乱序数据包的时候,协议要求接收端必须要回复一个ACK确认包,这个确认包中的Ack Number只能设置为3。

头长(Header Length):4bit,指示TCP头的长度,即数据从何处开始。最大为15,单位是32比特,即4个字节,与IP头中的长度定义相同。

保留(Reserved):4bit,这些位必须是0。为了将来定义新的用途所保留,其中RFC3540将Reserved字段中的最后一位定义为Nonce标志。

标志(Code Bits):8bit

CWR(Congestion Window Reduce):拥塞窗口减少标志被发送主机设置,用来表明它接收到了设置ECE标志的TCP包,发送端将通过降低发送窗口的大小来降低发送速率

ECE(ECN Echo):ECN响应标志被用来在TCP3次握手时表明一个TCP端是否具备ECN功能,并且表明接收到的TCP包的IP头部的ECN被设置为11。更多信息请参考RFC793。

URG(Urgent):表示紧急(The urgent pointer) 指针是否有效。

ACK(Acknowledgment):1表示这是一个确认的TCP包, 0则不是确认包。

PSH(Push):该标志置位时,一般是表示发送端缓存中已经没有待发送的数据,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。

RST(Reset):用于复位相应的TCP连接。通常在发生异常或者错误的时候会触发复位TCP连接。

SYN(Synchronize):表示同步序列编号(Synchronize Sequence Numbers)是否有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接发起端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。

FIN(Finish):带有该标志置位的数据包用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据。当FIN标志有效的时候我们称呼这个包为FIN包。

窗口大小(Window Size):16bit,表示从Ack Number开始还能接收多少字节的数据量,即当前接收端的接收窗口还有多少剩余空间。用于TCP的流量控制。

校验和(Checksum):16bit。发送端基于数据内容计算一个数值,接收端要与发送端数值结果完全一样,才能证明数据的有效性。接收端checksum校验失败的时候会直接丢掉这个数据包。CheckSum是根据伪头+TCP头+TCP数据三部分进行计算的。

紧急指针(Urgent  Pointer):16位,在URG标志设置了时才有效。与序号字段的值相加后表示最后一个紧急数据的下一字节的序号,可以说这个字段是紧急指针相对当前序号的偏移。

选项(Option):长度不定,但长度必须以是32bits的整数倍。常见的选项包括MSS、SACK、Timestamp等等,后续的内容会分别介绍相关选项。

一个完整的TCP头展示

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-01-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TCP/IP第四层--传输层TCP和TPC数据报文详解
与UDP不同的是,TCP提供了一种面向连接的、可靠的字节流服务。TCP是如何实现可靠连接?
黄规速
2022/04/14
3.6K0
TCP/IP第四层--传输层TCP和TPC数据报文详解
1万字30张图说清TCP协议
TCP(Transmission Control Protocol 传输控制协议)是一种基于IP的传输层协议,TCP协议面向连接、正面确认与重传、缓冲机制、流量控制、差错控制、拥塞控制,可保证高可靠性(数据无丢失、数据无失序、数据无错误、数据无重复到达)传输层协议。
网络工程师笔记
2021/05/17
1.5K0
1万字30张图说清TCP协议
tcpdump命令高级过滤方式
​ 长度4比特。这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为32bit(4个字节),即本区域值= IP头部长度(单位为bit)/(84),因此,一个IP包头的长度最长为“1111”,即154=60个字节。IP包头最小长度为20字节。
吴易娃
2024/01/12
8490
在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP
如果对网络工程基础不牢,建议通读《细说OSI七层协议模型及OSI参考模型中的数据封装过程?》
周陆军
2018/11/14
1.6K0
TCP、UDP、IP 协议分析
互连网早期的时候,主机间的互连使用的是NCP协议。这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能。为了改善这种缺点,大牛弄出了TCP/IP协议。现在几乎所有的操作
李海彬
2018/03/23
2.8K0
TCP、UDP、IP 协议分析
Python-对Pcap文件进行处理,获
        通过对TCP/IP协议的学习,本人写了一个可以实现对PCAP文件中的IPV4下的TCP流提取,以及提取指定的TCP流,鉴于为了学习,没有采用第三方包解析pcap,而是对bytes流进行解析,其核心思想为:若想要提取TCP Content,需在下层的IPV4协议中判断Protocol是否为TCP,然后判断下层的以太网协议的Type是否为IPV4协议(此处的IPV4判断,只针对本人所写项目);对于指定流需要获取Client以及Server的[IP,PORT]。
py3study
2020/01/19
4.1K0
Python-对Pcap文件进行处理,获
Python Web学习笔记之TCP/IP协议原理与介绍
HTTP、FTP、SMTP、Telnet等等协议,哦!那个HTTP协议啊就是访问网页用的那个协议啊然后那个······其实······你懂得,我们应该从实际来了解他,理解网络协议的作用与功能,然后再从根本来看他是具体怎么实现的。我们可以先从HTTP、FTP、DHCP、DNS、ARP等常见协议开始入手了解它是如何工作的,然后照着这个态度再去深入了解其他的协议。先不多扯了进入正题。 一、什么是TCP/IP? 顾名思义 TCP/IP(Transmission Control Protocol/Internet P
Jetpropelledsnake21
2018/05/03
1.3K0
Python Web学习笔记之TCP/IP协议原理与介绍
【网络技术联盟站】网络工程师深入篇之网络基础知识
②第二小的单位:字节(Byte),一个标准英文字母占一个字节位置,8 个 bit;一个标准汉字占二个字节位置,16 个 bit
网络技术联盟站
2021/01/12
5770
[精选]图文详解到底什么是三次握手四次挥手
在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。
码农编程进阶笔记
2021/07/20
4050
[精选]图文详解到底什么是三次握手四次挥手
TCP协议细节学习
TCP协议中可选的MSS(Maximum Segment Size,最大报文长度))参数,一般使用MTU代替,值为1460。这个值是怎么来的呢? Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。 假设MTU值和IP数据包大小一致,一个IP数据包的大小是:65535,那么加上以太网帧头和为,一个以太网帧的大小就是:65535 + 14 + 4 = 65553,看起来似乎很完美,发送方也不需要拆包,接收方也不需要重组。 那么假设我们现在的带宽是:100Mbps,因为以太网帧是传输中的最小可识别单元,再往下就是0101所对应的光信号了,所以我们的一条带宽同时只能发送一个以太网帧。如果同时发送多个,那么对端就无法重组成一个以太网帧了,在100Mbps的带宽中(假设中间没有损耗),我们计算一下发送这一帧需要的时间:
anakinsun
2019/06/11
5460
UDP的FPGA实现(中) | UDP段、IP包、MAC帧结构
UDP的长度是指包括包头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。理论上,包含报头在内的数据报的最大长度为65535字节,实际上,UDP的MTU一般为1500,这与CDMA/CS机制有关系,即使巨型包也不会超过65535,在基于USO和UFO层次时,可对UDP进行拆包处理。(这部分暂未研究,以后有机会一定要好好学习一哈)
根究FPGA
2020/06/30
3.4K0
UDP的FPGA实现(中) | UDP段、IP包、MAC帧结构
网络协议详解
计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信。网络编程就是如何在程序中实现两台计算机的通信
星哥玩云
2022/09/08
8930
网络协议详解
TCP报文头部(sip协议端口号是tcp还是udp)
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说TCP报文头部(sip协议端口号是tcp还是udp),希望能够帮助大家进步!!!
Java架构师必看
2022/04/11
2.3K0
TCP报文头部(sip协议端口号是tcp还是udp)
TCP/IP协议头部结构体(网摘小结)
================================================================================ IP协议   IP协议(Internet Protocol)是网络层协议,用在因特网上,TCP,UDP,ICMP,IGMP数据都是按照IP数据格式发送得。IP协议提供的是不可靠无连接得服务。IP数据包由一个头部和一个正文部分构成。正文主要是传输的数据,我们主要来理解头部数据,可以从其理解到IP协议。  IP数据包头部格式(RFC791)
阳光岛主
2019/02/20
2.2K0
wireshark捕获tcp数据包_抓包分析详解
通过本次实验,掌握使用Wireshark抓取TCP/IP协议数据包的技能,能够深入分析TCP帧格式及“TCP三次握手”。通过抓包和分析数据包来理解TCP/IP协议,进一步提高理论联系实践的能力。
全栈程序员站长
2022/10/04
9.7K0
wireshark捕获tcp数据包_抓包分析详解
WireShark抓包分析
简述:本文介绍了抓包数据含义,有TCP报文、Http报文、DNS报文。如有错误,欢迎指正。
全栈程序员站长
2022/07/01
1.1K0
WireShark抓包分析
TCP 请求头
TCP 请求头结构 Source Port(源端口):源端口号 (占用16位),发送端程序端口 Destination Port(目的端口):目的端口号(占用16位),接收端程序端口 Sequence
java404
2018/06/06
1.9K0
Java程序员必须掌握的网站知识 —— TCP
本文主要通过整理网络上的资料,整理出的关于TCP方面的简单理论知识。作为Java程序员虽然更多的时候我们都是直接调用现成的API,但是对网络知识有个宏观的概念能方便我们更好的编写代码。当然,文中涉及的
tomas家的小拨浪鼓
2018/06/27
1.1K0
原始 socket 编程
1.原始 socket 可以和内核一样直接对所有层进行操作(除了物理层)。可以更改 mac 更改 ip 更改端口。so dos 攻击就可以通过原始 socket 编程来伪造 ip 进行。 2.也可以访问经过网卡的所有数据.普通的 socket 只能访问发送给自己端口的数据。
战神伽罗
2019/07/24
2.1K0
原始 socket 编程
TCP协议重点总结(万字总结-附实例)
TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。
VIBE
2023/01/10
5670
TCP协议重点总结(万字总结-附实例)
推荐阅读
相关推荐
TCP/IP第四层--传输层TCP和TPC数据报文详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档