TCP/IP协议的建立连接与关闭连接过程
一、建立连接(三次握手)
第一次握手:建立连接时,客户端发送SYN
(seq=x)包到服务器,并进入SYN_SENT状态
,等待服务器的确认。SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到SYN包
,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即发送SYN+ACK包
,此时服务器进入SYN_RECV状态
;
第三次握手:客户端收到SYN+ACK包
,向服务器发送ACK(ack=y+1)包
,此包发送完毕,客户端和服务器进入ESTABLISHED状态
,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
SYN(synchronous建立联机)、ACK(acknowledgement 确认)、PSH(push传送)、FIN(finish结束)、RST(reset重置)、 URG(urgent紧急)
Sequence number(顺序号码) Acknowledge number(确认号码)
二、关闭连接(四次挥手)
第一次挥手:客户端发送FIN+ACK包
(序号为seq=a,确认序号ack=b)给服务端,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态
。
第二次挥手:服务端收到FIN+ACK包
后,发送ACK包
给客户端进行确认,服务端进入CLOSE_WAIT状态
。客户端收到ACK包
后进入FIN_WAIT_2状态
。到这里,关闭一个单向通道。
第三次挥手:服务端发送FIN+ACK包
给客户端,服务端进入LAST_ACK状态
。
第四次挥手:客户端收到FIN+ACK包
后,发送ACK包
给服务端进行确认,客户端进入TIME_WAIT状态
,在等待30秒
(可修改)后进入CLOSED状态
。服务端收到ACK包后进入CLOSED状态
,关闭另一个单向通道。
三、TCP与IP报文结构
●源、目标端口号字段:占16比特。TCP协议通过使用"端口"来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端口"(Well-Know Port)为用户提供服务。
●顺序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
●确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。
●头部长度字段:占4比特。给出头部占32比特的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。
●标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:
◆URG:紧急指针(urgent pointer)有效。
◆ACK:确认序号有效。
◆PSH:接收方应该尽快将这个报文段交给应用层。
◆RST:重建连接。
◆SYN:发起一个连接。
◆FIN:释放一个连接。
●窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。
●TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。
●紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
●选项字段:占32比特。可能包括"窗口扩大因子"、"时间戳"等选项。
参考文章:http://aofengblog.blog.163.com/blog/static/631702120152322848786/