TCP
Transmission Control Protocol是一种面向连接的、可靠的、基于字节流的传输层通信协议
三次握手
- 建立连接,客户端发送连接请求报文段,将SYN位设为1,Sequence Number设为x,然后客户端进入SYN_SEND状态,等待服务器的确认
- 服务器收到SYN报文段,对SYN进行确认,将AcknowledgementNumber设为x+1;同时将SYN设为1,SequenceNumber设为y,服务端将上述所有信息放到一个报文段(SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态
- 客户端收到SYN+ACK报文段,将AcknowlegementNumber设为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,三次握手完成。
为什么需要三次握手
第二步,服务器端收到SYN,服务器端确认了客户端的发送能力没问题
第三步客户端收到SYN+ACK,客户端确认了服务器端的发送能力和接收能力没问题,客户端发送ACK给服务器端,服务器端确认了客户端的接收能力没有问题。
如果是两次握手
如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。
四次挥手
- 主机1(客户端或者服务器端)设置Sequence Number和Acknowlegement Number, 向主机2发送FIN报文段,此时主机1进入FIN_WAIT_1状态,表示主机1没有数据要发送给主机2了
- 主机2收到FIN报文段,向主机1回一个ACK报文段,Acknowledgement Number为Sequence Number+ 1,主机2进入FIN_WAIT_2状态,主机2同意主机1的关闭请求
- 主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态
- 主机1收到FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态,主机2收到ACK,就关闭连接,主机1等待后没有收到回复,证明服务器端正常关闭,主机1也关闭连接
为什么需要四次挥手
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。