TCP报文
字段介绍:
1、源端口(16bit):一个端口所属一个进程,可以通过源端口定位到具体的进程;
2、目的端口(16bit):通过目的端口和Ip报文的目的ip地址可以唯一定位到一个进程;
3、序号(32bit):当前发送数据的其实需要,每一个字节都和一个序号对应,通过需要可以保证数据的有序性;
4、确认序号(32bit):只有哦ACK为1时确认需要才有效,表示期望下一次希望收到的数据的起始序号;
5、数据偏移(4bit):报文中包含数据部分,因为报文头的大小不是固定的(由于选项和填充的存在),所以通过这个数据偏移定位到数据相对于整个TPC报文的起始位置。
6、保留(6bit):保留,以作之后其他用途;
7、控制位:
(1)URG:紧急指针标志:1:紧急指针有效、0:紧急指针无效;
(2)ACK:确认序号标志:1:确认号有效、1:确认号无效;
(3)PSH:push标志,1:带有push标志的报文,表示接收方在收到报文后应尽快交给应用程序,而不是放到缓存区;
(4)RST:重置连接标志:用于重置由于主机崩溃或者其他错误导致的错误连接。或者用于拒绝非法的报文段或者连接请求。
(5)SYN:同步序号标志,用于建立连接过程,SYN=1、ACK=0表示没有使用捎带的确认域;SYN=1、ACK=1表示连接应答捎带一个确认域。
(6)FIN:结束标志,表示没有数据发送了,结束本次连接请求。
8、窗口(16bit):滑动窗口大小,表示告诉发送端接收端的缓存大小,从而进行流量控制;
9、校验和(16bit):根据整个TCP报文生成的一个校验码,在发送端生成,在接收端校验;
10、紧急指针(16bit):只有URG等于1时才有效,紧急指针是一个正的偏移量,和***相加生成一个紧急数据最后一个***,对于这部分数据会以一个紧急的方式发送。
11、选项和填充(不固定大小):加上一个额外的信息,比如MSS等。
12、数据(不固定大小):数据部分可有可无。
三次握手和四次挥手
对于其中的状态,看看netstat命令文档中的状态解释:
- Established
表示经过三次握手之后,建立了TCP连接; - SYN_SENT
表示客户端尝试建立一个连接的初始过程,相当于三次握手的第一次过程,发送SYN报文; - SYN_REVC
表示服务端收到一个建立连接的请求,相当于SYN报文被服务端成功地接收; - FIN_WAIT1
客户端数据传输完毕,发送FIN报文请求关闭,此时客户端就处于FIN_WAIT1阶段; - FIN_WAIT2
服务端接收到了客户端的FIN报文,并发送ACK报文给客户端,客户端接收到此报文后处于FIN_WAIT2阶段; - TIME_WAIT
服务端也打算关闭了,发送了一个FIN报文,客户端收到了FIN保本,从装填FIN_WAIT2变为了TIME_WAIT状态; - CLOSED
表示TCP连接完全的关闭了 - CLOSE_WAIT
服务端收到客户端的FIN报文段后会处于此阶段; - LAST_ACK
服务端的最后一个数据发送完毕后会处于此阶段; - CLOSING
客户端和服务端的socket都关闭了,但是所有的数据并没有发送完毕;
IP报文
IP报文字段解释:
1、4位版本号:表示IP协议的版本,IPV4的值0100,IPV6的值0110;
2、4位首部长度:指的是IP包头部的长度,最大值是15,即 15 * 32 / 8 = 60个字节,所以选项部分的最大值是40个字节;
3、8位服务类型:前3位表示优先级、后4位是标志位、最后一位保留未用;
4、16位总长度:指的是IP包的总长度,最大长度是65535个字节。在以太网上允许的最长包长为1500B,所以当IP包过大时会进行分片传输;
5、16位标识符:用于数据在分段传输时标识其***;(每从上层接收到一个数据报时,就将内置的一个累加器加1,并将其值赋值到标识符字段)
6、3位标志:三位从左到右分别为MF、DF、未用。MF=0表示没有更多的分片;DF=1表示路由器不能对改数据包分段;(如果IP报文过大时,会存在同一个IP数据报文被分片的情况)
7、13位片偏移:也称为段偏移,用于标识数据包在上层初始数据报文中的偏移量;(如果同一个IP数据包本分片后,通过片偏移就可以知道分片的相对位置)
8、8位生存时间:初始值由操作系统设置,每经过一个路由器转发后其值都会建议,如果其值等于0后还没有到达目的地,就行丢弃该数据包;
9、8位协议:标识上层所使用的协议;
10、16位首部校验和:只对IP数据包的首部进行校验,不包含数据部分;
11、32位源IP地址:标识数据从哪里来;
12、32位目的IP:标识数据到哪里去;
13、选项部分:主要有安全和处理限制、记录路径、时间戳等。