TCP三次握手简述 客户端client 服务器 server
SYN 是请求同步的意思,synchronize(同步)的缩写
ACK 是确认同步的意思,acknowledgement(确认)的缩写
TCP 是主机对主机层的传输控制协议,提供可靠的连接服务
TCP 的三次握手
第一次握手
建立连接时,客户端发生SYN包(SYN=J)到服务器socket.listen(被动打开)
并进入SYN_SEND状态等待服务器的确认
客户主动去链接服务器并发送SYN假设序列号为J 服务器socket.listen(被动打开)
第二次握手
服务器收到SYN包,必须确认客户的SYN,ACK=J+1
同时自己也发送一个SYN包,SYN=K
即,SYN+ACK包,此时服务器已经进入SYN_RECV状态
服务器在收到SYN后,他会发送给一个SYN以及一个ACK(应答)给客户;ACK的序列号是j+1表示是给SYN的应答,新发送的SYNk序列号是k
第三次握手
客户在收到新SYNK,ACK j+1后,也回应ACK k+1以表示收到
紧接着两边就可以开始数据发送数据了
TCP四次挥手简述
TCP4次挥手
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手
常见问题:
1)为什么A在WAIT-TIME状态必须等待2MSL的时间??
为了保证A发送的最后一个确认报文段能够达到B。这个ACK报文段可能丢失,因而使处在LAST-ACK状态的B收不到A发送的FIN+ACK报文段的确认。B会超时重传这个ACK+FIN报文段,而A就能在这个时间内收到这个重传的报文。接着A在再重传一次确认报文,并且重启2MSL计时器。使A和B都能正常的进入释放连接状态。
防止已经关闭的连接报文段出现在新的连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有旧报文段都从网络中消失。这样新的连接中不会出现旧连接的数据报文。
(2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢??
这是由于服务端的LISTEN状态下收到SYN报文的建立连接请求后。它能够把ACK和SYN(ACK起应答作用。而SYN起同步作用)放在一个报文里来发送给客户端。
但关闭连接的时候,当服务端收到客户端的FIN报文段的时候,表示客户端没有数据发送给服务端了,但是服务端可能还有数据要发送给客户端,这时TCP连接处于半连接状态。当服务端没有数据再发送给客户端的时候就会向客户端发送一个FIN报文表示服务端要关闭连接,ACK和FIN一般不会分开发送。这个过程也是由于TCP的通信方式是全双工的,发送和接收方都需要发送FIN和ACK。