TCP连接及11种状态总结
一、什么是TCP:
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内 [1] 另一个重要的传输协议。
二、什么是TCP连接:
为实现数据的可靠传输,TCP要在应用进程间建立传输连接。它是在两个传输用户之间建立一种逻辑联系,使得通信双方都确认对方为自己的传输连接端点。
两个序号和六个标志位:
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
三、TCP建立连接(一般称为三次握手)
过程描述总结:
第一次握手:client端向server端发送一个请求为,SYN=1,并随机生成一个序列号作为自己的初始序号发送server,seq=x,
第二次握手:server对client的数据包确认,SYN=1,ACK=1,收到序列号为x的数据包为ack=x+1,同时回复自己的初始序列号,seq=y
第三次握手:client收到server的确认信息并建立连接,ACK=1,这次消息的序列号为seq=x+1,client收到server的序列号为seq=y,则ack=y+1
然后client和server进去established状态,进行数据传输
解释:SYN =1 发起一个新连接请求
seq=x 序列号对数据进行标记,(x为随机号)
ACK=1 确认对方的序号有效
ack =x+1 server端收到client的序列号的确认回复
seq = y server端的初始序列号(y为随机号)
seq =x+1 client第二发送的消息的序列号(x+1)
ack=y+1 client收到server序列号的确认回复
四、TCP释放连接(一般称为四次挥手)
由于TCP连接是是全双工的,因此,每个方向都必须要单独关闭,client端和server端都要发送FIN=1 来终止连接
过程描述总结:
第一次挥手:client向server发送连接释放,即FIN=1,并生成消息序列号seq=u,client进去了FIN_WAIT-状态;
第二次挥手:server收到client发送的FIN,发送ACK=1,确认序号为ack=u+1,并生成server序列号seq=v ,server进入CLOSE_WAIT状态;
第三次挥手:server发送一个FIN,用来关闭client到server数据传输,Server进入LAST_ACK 状态;
第四次挥手:client收到FIN,进入TIME_WAIT状态, 等待 2MSL 时间,发送ACK=1,确认序号ack=w+1, 完成四次挥手
五、TCP连接11种状态
解释
CLOSED:初始状态,表示TCP连接是“关闭着的”或“未打开的”。
LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接受客户端的连接。
SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
ESTABLISHED :表示TCP连接已经成功建立。
FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
FIN_WAIT_2:等待远端TCP 的连接终止请求。
CLOSE_WAIT:等待本地用户的连接终止请求。
LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
CLOSING:等待远端TCP 的连接终止请求确认。