TCP(Transmission Control Protocol, 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。位于IP层之上,应用层之下的中间层。

一、TCP首部格式

和iptables相关的TCP知识点总结_TCP iptables

 

分析:

每一个TCP报文首部中都包含源端口和目标端口,用于标识一个应用进程;这两个值和IP首部中源IP和目标IP组合成套接字,唯一的标识某台主机上某个服务。(有效使用端口号:65535个=2^16-1)

序列号(32bit)是用来唯一标识从发送端到接收端的数据报文。

确认号(32bit)当ACK为1时确认号是生效的

首部长度(4位)保留(6位)
标志位(6位):ACK(确认)、SYN(请求)、FIN(结束)

窗口大小(16位):指TCP流控中的滑动窗口大小

校验和(Header Checksum(16bit)):用CRC32算法计算首部校验和(类似于单向加密)

紧急指针:URG为1时,紧急指针是生效的

Options:变长的

Data(Total Length - 首部长度)

二、TCP三次握手

和iptables相关的TCP知识点总结_TCP iptables _02

分析:
 

第一次握手:Client端发送请求数据包,此时SYN=1,ACK=0,FIN=0,同时发送序列号X;

第二次握手:Server端接收到客户端的请求,向Client端发送回应,此时SYN=1,ACK=1,FIN=0,同时发送确认号(X+1)和序列号Y;

第三次握手:Client端接收到Server端的确认报文后,给Server端发送确认号(Y+1)和序列号Z。

此时三次握手成功,连接建立。

 

三、TCP四次断开

和iptables相关的TCP知识点总结_TCP iptables _03 

分析:

(1)Client向Server发送FIN=1的断开请求

(2)Server向Client发送ACK=1的确认断开请求

注意:此时并不会断开,还需要Server端再说断开,双方同意后才是断开成功。

(3)Server向Client发送FIN=1的端口请求

(4)Client向Server发送ACK=1的确认断开请求

 

四、TCP连接状态转换

和iptables相关的TCP知识点总结_TCP iptables _04

 

  三次握手的状态分析:

服务器端被动打开所完成的功能:
(1)服务器端在没有启动时是CLOSED状态
(2)当服务器端被动打开时,处于LISTEN状态(此时没有任何连接)
(3)当服务器端收到客户端的SYN=1的请求(即TCP握手中的第一次),并且服务器端回应SYN=1,ACK=1的确认信息;此时服务器端就处于SYN_RCVD状态(即TCP握手中的第二次)
(4)当服务器端收到客户端的ACK=1的确认信息后,就处于ESTABLISHED状态(即TCP握手中的第三次)
 
客户端主动打开所要完成的功能:
(1)客户端在没有发起连接前也是处于CLOSED状态
(2)当客户端发送SYN=1的请求后就处于active open状态,此时的状态称为SYN_SENT状态
(3)当客户端收到SYN=1 ACK=1,并发送ACK=1时,就处于了ESTABLISHED状态

四次断开的状态分析:
对于客户端而言:
(1)客户端发送FIN=1的请求,此时客户端就处于FIN_WAIT_1状态
(2)当客户端接收到服务器端回应给ACK后,此时客户端就处于了FIN_WAIT_2状态
(3)当客户端接收到服务器端的FIN,并发送给服务器端ACK时,就会处于TIME_WAIT状态(这种状态有一个超时时间:2MSL即240s),此时是为了让服务器端收到自己发送的ACK。

对服务端而言:
(1)服务器端将客户端所请求的内容都发送给客户端以后,就处于CLOSE_WAIT状态
(2)当服务器端收到客户端发送的FIN,并回应给客户端ACK;然后服务器端再发送给客户端FIN时,就会处于LAST_ACK状态
(3)当服务器端收到客户端发送的ACK之后,就处于CLOSED状态

 

补充:IP首部格式:

和iptables相关的TCP知识点总结_TCP iptables _05

 IP首部:共32bit(4个字节)

IP版本号(4bit):用于标识是IPv4还是 IPv6

首部长度(4bit):由于option是可选择的,所以需要指定首部长度

服务类型(8bit):用于标识TOS、QOS,定义IP协议包的处理方法

Total Length(16bit):从首部到数据的总长度

Fragment ID(16bit ):片段标识,将一个大的数据分成多个IP包,Fragment ID就是用来标识这些IP包,同一个数据包的Fragment ID是一样的,这样可以保证标识哪些IP包是同一个文件。

Fragment Offset(13bit):片偏移,用于标识当一个文件被分成多个IP包传送时,每一个IP包所在的文件中的位置。

标识位(3bit):
   DF:Don't Fragment,表示没有分片
   MF:More Fragment,表示分成了多个片

TTL(8bit):生存周期,TTL会有一个初始值,每过一个路由器就减1,直到为0,数据包就会被丢弃,这是避免网络幽灵的。

Protocol(8bit):标识是TCP、UDP、ICMP的 

Header Checksum(16bit):用CRC32算法计算首部校验和(类似于单向加密)

源IP(32bit)

目标IP(32bit)

Options:变长的,最长不能超过40bytes

Data(Total Length - 首部长度)