2.4 tcp
tcp报文结构如下:

可以使用ssh 连接与断开的过程抓包看tcp3次握手与4次挥手的过程

tcpdump抓包后保存后使用wireshark 分析 3次握手过程及报文结构如下:


报文结构分析如下:
源端口和目的端口字段
- TCP源端口(Source Port):源计算机上的应用程序的端口号,占 16 位。
- TCP目的端口(Destination Port):目标计算机的应用程序端口号,占 16 位。
序列号字段
TCP序列号(Sequence Number):占 32 位。它表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中,所传送的字节流的每一个字节都会按顺序编号。当SYN标记不为1时,这是当前数据分段第一个字母的序列号;如果SYN的值是1时,这个字段的值就是初始序列值(ISN),用于对序列号进行同步。这时,第一个字节的序列号比这个字段的值大1,也就是ISN加1。
确认号字段
TCP 确认号(Acknowledgment Number,ACK Number):占 32 位。它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1。
数据偏移字段
TCP 首部长度(Header Length):数据偏移是指数据段中的“数据”部分起始处距离 TCP 数据段起始处的字节偏移量,占 4 位。其实这里的“数据偏移”也是在确定 TCP 数据段头部分的长度,告诉接收端的应用程序,数据从何处开始。
保留字段
保留(Reserved):占 4 位。为 TCP 将来的发展预留空间,目前必须全部为 0。
标志位字段
- CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
- ECE(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
- URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。
- ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
- PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。
- RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
- SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。
- FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。
窗口大小字段
窗口大小(Window Size):占 16 位。它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间。该字段可以用于 TCP 的流量控制。
TCP 校验和字段
校验位(TCP Checksum):占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。
紧急指针字段
紧急指针(Urgent Pointer):仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数,占 16 位。当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。
可选项字段
选项(Option):长度不定,但长度必须是 32bits 的整数倍。
4次挥手的过程

2.5 udp
udp 报文结构结构如下:

在下一节2.6中有抓过dns报文,而dns报文基于udp报文,所以可以使用wireshark一块分析,udp报文分析如下:

源端口:52984
目的端口:53
长度:39
校验值:0xaea1
2.6 dns
dns 报文之前很少接触过,重点结合往上博客学习了一下,同时使用wireshark抓了一下对应的报文,大致分析了一下:
DNS 分为查询请求和查询响应,请求和响应的报文结构基本相同。DNS 报文格式如下图所示

上图中显示了 DNS 的报文格式。其中,事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这 6 个字段是DNS的报文首部,共 12 个字节。
整个 DNS 格式主要分为 3 部分内容,即基础结构部分、问题部分、资源记录部分
1) 基础结构部分
DNS 报文的基础结构部分指的是报文首部,如图所示:

该部分中每个字段含义如下。
事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。
标志:DNS 报文中的标志字段。
问题计数:DNS 查询请求的数目。
回答资源记录数:DNS 响应的数目。
权威名称服务器计数:权威名称服务器的数目。
附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。
基础结构部分中的标志字段又分为若干个字段,如图所示

标志字段中每个字段的含义如下:
QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
rcode(Reply code):返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。
query报文的基础部分
response报文报文的基础部分

2)问题部分
问题部分指的是报文格式中查询问题区域(Queries)部分。该部分是用来显示 DNS 查询请求的问题,通常只有一个。该部分包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类。
问题部分格式如图所示:

该部分中每个字段含义如下:
查询名:一般为要查询的域名,有时也会是 IP 地址,用于反向查询
查询类型:DNS 查询请求的资源类型。通常查询类型为 A 类型,表示由域名获取对应的 IP 地址
查询类:地址类型,通常为互联网地址,值为 1
query报文的问题部分

response报文报文的问题部分

3) 资源记录部分
资源记录部分是指 DNS 报文格式中的最后三个字段,包括回答问题区域字段、权威名称服务器区域字段、附加信息区域字段。这三个字段均采用一种称为资源记录的格式,格式如图所示:

资源记录格式中每个字段含义如下:
域名:DNS 请求的域名。
类型:资源记录的类型,与问题部分中的查询类型值是一样的。
类:地址类型,与问题部分中的查询类值是一样的。
生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
资源数据长度:资源数据的长度。
资源数据:表示按查询段要求返回的相关资源记录的数据。
资源记录部分只有在 DNS 响应包中才会出现

2.7 dhcp
DHCP(Ipv4)报文的种类有八种:分别为DHCP Discover、DHCP Offer、DHCP Request、DHCP ACK、DHCP NAK、DHCP Release、DHCP Decline、DHCP Inform。各种类型报文的基本功能如下:

DHCP的8种报文格式是一样的,它是通过报文中的字段的取值不同,来划分类型和信息。如下图为DHCP报文格式及各个字段的说明


DHCP报文中部分可选字段的说明

使用tcpdump抓取dhcp报文,wireshark 进行解析报文如下:


2.8 http
HTTP协议是以ASC码传输,建立在TCP/IP协议之上的应用层规范。这块重点看了一下主要字段,并简单的抓了下包对照着看了一下
HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据四个部分组成
如下图所示:

请求行是由请求方法、url字段以及HTTP协议版本字段三个部分组成,它们用空格分开。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
而常见的有: GET 和 POST
wireshark 抓包如下:

HTTP响应报文是由状态行、响应头部、空行和响应包体四个部分组成,如下图所示:

这响应中状态行(status line)代替了请求行。状态行通过提供一个状态码来说明请求情况。
状态行
状态行由HTTP协议版本(HTTP-Version),状态码(Statue-Code) 和 状态码描述文本(Reason-Phrase)三个部分组成,它们之间用空格隔开;
状态码有三位数字组成,第一位定义了响应的类别,可能有五种取值:
1xx:表示服务端已经接收到客户端请求,客户端可以继续发送请求;
2xx:表示服务端已经成功接收请求并处理;
3xx:表示服务器要求客户端重定向;
4xx:客户端请求有问题;
5xx:服务端未能正常处理客户端的请求出现错误;
常见状态码描述文本有如下:
200 OK:请求成功;
400 Bad Request:客户端请求语法有问题,不能被服务端理解;
401 Unauthorized:请求未经授权,必须与Authorization请求报头域一起使用(eg:BASE64用户身份验证);
403 Forbidden:服务器收到请求但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因;
404 Not Found:请求的资源不存在,eg,输错了URL;
500 Internal Server Error:服务器发生错误,无法完成客户端请求;
503 Service Unavailable:表示服务器当前不能处理客户端请求,一段时间之后可能恢复正常
wireshark 抓包如下:
