三次握手
第一次:客户端给服务器发送一段TCP报文,标记位为syn,意思是请求建立新链接。
第二次:服务器给客户端返回一段TCP报文,标记位为syn和ack,意思是确认可以接收客户端发送的数据,并同意建立新链接。
第三次:客户端给服务器再次发送一段TCP报文,标记位为syn和ack,意思是我可以收到你的数据确认和你建立新链接。(注意第三次握手可以减少服务器开销,例如这种情况:若client 发出的第一个连接请求报文在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。那么这就是一个失效的报文。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样server 的很多资源就白白浪费掉了。)
四次断开
举例:有客户端A和服务器B正在发送数据
(1)A发送完了,想要断开链接,于是就给B发送FIN报文,A进入FIN_WAIT_1状态
(2)B收到了A发送的FIN,发回给A一个ACK报文用以确认收到,B进入CLOSE_WAIT状态
(3)B关闭了与A的链接口,发回给A一个FIN报文,B进入LAST_ACK状态
(为什么B不将FIN和ACK一并发送呢?
答:“接收到A发来的请求时,B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给A。”)
(4)A接收到以后给B发送ACK报文,确认断开链接,B进入CLOSED状态
以下为TCP报文格式