一、IP协议报文详解
IP协议在网络层,IP协议主要提供了IP编址,让主机可以在不同网段之间通信,报头信息解析如下:
1、4位版本号(Version):一般是IPv4或IPv6;
2、4位头部长度(Header Length):IP报头长度;
3、8位服务类型(Type of Service)
4、16位总长度(Total Length):IP报文的总长度,包括报头和数据;
5、16位标识符(Identification),标识每个已切分的数据包;
6、3位标记(Flags):第一位保留,第二位为DF(为1不将数据分包),第三位为MF(为1表示后面还有数据包);
7、13位包偏移(Fragmenet Offset):表示IP包在原数据包中的位置;
8、8位TTL,数据包的存活时长;
9、协议(Protocol):IP报头后面的报文协议;
10、头部检查和(Header Checksum)
11、源IP地址(Source Address):本机IP地址;
12、目的IP地址(Destination):目的IP地址。
下面是一个IP报头的实际例子:
二、 TCP报文分析
TCP协议在网络五层模型中的传输层,TCP提供端到端的传输,保证传输的可靠性,面向连接,需要预先检测连接状态和条件,另一个重要的功能就是提供多路复用,主要通过应用程序提供不同的端口实现。
具体对TCP协议的理解就是它的报文格式了,对任一种协议都是这样,报文格式是协议的主要内容。TCP报文包含的字段和作用如下:
1、16位源端口(Source Port):源主机即本机的端口,由应用程序提供,端口范围为1-65535,1-1023为系统端口,1024-65535为用户自定义端口。平时我们编写服务器都会提供端口,而客户端一般不用,但是客户端同样还是有端口的,只不过没有指定的话会由系统指定。
2、16位目标端口(Destination Port):需要主动连接的主机端口。
3、32位序列号(Sequence Number):受SYN控制位影响,表示初始序列号或数据分段的标识。
4、32确认号(Acknowledgement Number):是否确认收到对应序列号的数据包,确认收到的话序列号+1表示确认。
5、4位首部长度(Headr Length):TCP头的长度。
6、6位保留位(Reserved bits):全部位都是0,留在将来定义新功能。
7、控制位
(1)URG(Urgent):紧急位,指定紧急指针是否有效,配合紧急指针使用,为1则指明紧急数据包。
(2)ACK(Acknowledgement):确认位,指定该数据包是否是确认数据包,指定确认号是否有效。
(3)PSH(Push):推送位,表示有数据需要处理。
(4)RST(Reset):重置位,为1则需要重新连接,一般重连次数是3次。
(5)SYN(Synchronize):同步序列或初始化,表明是否需要新建链接,是否为首次连接的初始序列,指定序列号是否有效。
(6)FIN(Finish):结束位,为1表示请求断开连接。
8、16位窗口大小:类似于缓冲区的大小,这是主机双方协议好的大小,可以在这里做流量控制。
9、16位校验和(Checksum):对这个TCP报文的校验和。
10、紧急指针(Urgent Pointer):URG控制位设置为1时才有效。
11、选项(Options):长度不确定,长度为32位。
12、数据内容(Data)。
一个实际的TCP报头信息例子如下:
TCP三次握手四次分手
我们可以从TCP的报文信息中了解到,其6位的的操作位是比较重要的,控制着TCP整个传输和连接。从TCP建立连接到断开连接,基本起码需要经过三次握手,传输数据,然后到四次分手,过程中都少不了对控制位的使用。
1、TCP三次握手过程
主机client主动发送SYN数据包到服务器server,即Seq=x,SYN=1,序列号随机生成为x,SYN位置1表示32位序列号为初始序列号,主机client需要和server建立连接。
服务器server收到请求并响应主机client,向client发送SYN+ACK数据包,即Seq=y,Ack=x+1,SYN=1,ACK=1。ACK为1表示这是一个确认包,Ack为32位确认位,将x序列号+1表示已经收到x+1之前的所有数据包。Seq=1,SYN=y,表示服务器也需要和client建立连接。
主机client收到服务器server的数据包,向服务器发送ACK报文数据,即Seq=x+1,Ack=y+1,ACK=1,ACK为1表示一个确认包,确认内容为y+1,现在可以开始建立TCP连接了。
2、TCP四次分手过程
首先主机client需要和服务器server断开连接,于是向server发送FIN/ACK数据包,即FIN=1,ACK=1,FIN置1表示请求断开连接。
服务器server回应请求并发送ACK报文,即ACK=1,这时主机已和服务器断开连接。
服务器server也向主机client请求断开连接,同样向client发送FIN/ACK报文,即FIN=1,ACK=1.
主机client同样回应断开请求,发送ACK报文,ACK=1,此时服务器已和主机端口连接,整个TCP连接完整结束。
三、UDP报文
UDP(User Datagram Protocol)用户数据报协议是一种面向非连接的传输协议,同样也属于传输层,它仅仅提供有限的错误检查,不保证传输的可靠性,但是传输速度比较快,在进程应用于语音流和视频流的传输,UDP的报文结构如下:
1、16位源端口号:应用服务提供的端口号;
2、16位目标端口号:目标主机应用程序开放的端口号;
3、16位UDP长度:报文的长度,包括报头和数据的长度;
4、16位UDP检验和:将前面的报头信息做一个检验和。
UDP报头的实际例子如下: