ip报文格式
其中相关字段说明如下:
IP version:表示IP协议的版本号,IP协议版本有IPv4和IPv6这两种版本号,占4bit
(Hdr Len)Herader Length:首部长度,这个字段主要说明ip协议包头包含了多少个32bit的字节数。ip协议包头基本为20字节(4byte*5),这里的5表示是5行的意思。也就是说如果options选项中 不包含其他数据的话,那么ip协议报文的首部长度为20byte。由于首部长度占用4个bit,因此首部长度最大字节为15*4=60字节。
TOS:服务类型。用于表示ip数据包的服务类型,这个字段与qos有关,对于不同的ip数据包,给予不同的服务类型,那么该数据包被处理的方式不一样。占8bit
Total Length:ip包总长度,该长度为首部长度加上数据这部分就是总长度,因此可以利用包总长度和首部长度来计算出数据的大小,占16bit
Identification(Fragment ID):这是ip数据包的标识,如果ip数据包过大,那么数据包就会进行分段,这个标识就是确定哪些分段是同一个数据包的。占16bit
R:保留位,占1bit
DF:表示禁止分段,占1bit
MF:为1表示还有更多分段,占1bit
Fragment Offset:分段偏移,表示每个分段在整个数据包中的位置,以便重组数据包,占13bit
TTL:生存时间,每经过一个路由器都会减一,以便防环,占8bit
Protocol:用来标识上层协议的。由于tcp/udp等从四层协议或者其他三次协议都是通过ip来传输的,因此该字段用来说明该数据包处理完成后,交给哪一个上层协议来处理。占8bit
Header Checksum:校验和,用来验证ip数据包在传输过程中是否被损坏了。占16bit
Source IP Address:源ip地址,占32bit
Destination Ip Address:目标地址,占32bit
Options:可选选项,占32bit
Data:ip承载的数据,占32bit
UDP报文格式
udp的报文格式比较简单,这里只是简单介绍一下
源端口号:占16bit
目的端口号:占16bit
udp长度:占16bit
udp校验和:占16bit
Data:udp数据,占32bit(可选)
TCP报文格式
相关字段说明如下:
Source port Number:源端口号,如果某个服务要想和外面主机通信。必须要监听在某个端口号上面才行,这样才能建立起连接。这个字段占16bit。因此总端口共有65536个。
Destination Port Number:目标端口号,占16bit。目标端口总共有65536个。
sequence Number:序列号,这个字段是用来标识报文发送时的顺序,以及接受后按着该字段的号码来排序处理。占32bit。
Acknowledge NUmber:确认号,是用来确认对方发送过来的信息是否收到。占32bit
确认号=(对方的)序列号+1
Header Length:首部长度,这个字段和ip协议中的首部字段差不多,该字段说明了tcp报文包含了多少个32byte的字节数。tcp基本报文大小为4byte*5=20byte,占4bit
Reserved:保留字段,占6bit
ACK:当ACK为1时,表示确认号是合法的;为0是,表示数据报文不包含确认信息,那么确认字段会被省略。占1bit
PSH:表示是带有PUSH标志的数据。接收方因此请求数据报一到便可送往应用程序而不必等到缓冲区装满时才传送,占1bit
RST:用于复位由于主机崩溃或其它原因而出现的错误的连接。还可以用于拒绝非法的数据报或拒绝连接请求,占1bit
SYN:表示请求建立连接,占1bit,SYN=1表示发送建立连接请求
FIN:表示是否断开连接,占1bit,为1表示断开连接
Windows Size:窗口大小,该字段说明了tcp报文在传输时最大的报文字节是多少,占16bit
TCP Checksum:tcp校验和,用来验证tcp报文在传输中是否被损坏,占16bit
Urgent Pointer:紧急指针
以上有用的字段就这些啦!
TCP和UDP的区别
TCP所具有的特点:
1、面向连接的传输,是一种可靠传输机制
2、具有重传机制
UDP所具有的特点:
1、无连接的传输,因此不可靠
2、尽力而为的传输,不能确保数据是否能够到达目的地
3、传输数据快,开销小
TCP的三次握手和四次断开原理详解
在客户端和服务器端在没有建立连接之前,都处于CLOSED状态
1、首先client A向server B发起SYN请求,请求建立连接,此时client A的seq=100。此时client A处于SYN SENT状态
2、server B收到SYN请求后,准备对client A发起的SYN请求进行确认。且server B的ACK号=(clientA)seq号+1=101,并同时向client A发起建立SYN连接,此时server B的seq=300。并将其发送给client A。此时server B处于SYN RCVD状态
3、client A收到server B发送的SYN请求,并准备对其进行确认。因此,此时的client A的ACK号=(server B)seq号+1=301,并将其发送给server B。此时client A和server B都处于ESTABLISHED状态。
4、这样,三次握手建立后就可以进行数据传输了。
四次断开过程
5、当client A要与server B断开连接时,会发送FIN请求,且此时报文中的FIN=1。此时client A进入WAIT 1状态。
6、当server B收到client A发送过来的FIN请求,并将会发送ACK报文,用来确认已收到报文。此时server B处于CLOSE WAIT状态。同时也会发送FIN(FIN=1)报文给client A,请求断开连接。此时server B处于LAST ACK状态。
7、当client A收到server B发送过来的ACK报文时,此时client A处于WAIT 2状态。并再次发送ACK报文给server B用来确认已收到FIN报文。此时client A处于TIME WAIT状态。其实在client A处于TIME WAIT状态前,有个CLOSING状态,这个状态是网络原因导致server B发送的FIN报文,client A没有收到时才会出现的,一旦server B重传后,client A收到后就会变成TIME WAIT状态。
8、在client A处于TIME WAIT状态时,经过2s(2MSL)后,client A就会断开连接,且处于CLOSED状态,进而server B也断开连接处于CLOSED状态。
说明:这里的2s也是用来等待client A发送的ack报文是否到达server B的,如果没有到达,则在这段时间内会重传。这个时间过后,client A就会断开连接。
这样,client A和server B经过四次断开就断开连接了。
TCP的三次握手和四次断开过程以及每个过程中的各个状态码如下图所示:
本文出自 “linux学习之路” 博客,谢绝转载!