TCP 三次握手 与 四次握手
TCP三次握手
ACK 和 ack 的区别 ,ACK 是 一个确认字符;ack代表确认编号,ack值 = 上一次的seq + 1 ,作用是接受上一次远端主机传来的sep + 1 然后再传给远端主机,代表从远端主机接受的数据结尾编号,从而推算出这次接受了多少数据。
1) 客户端 向 服务器端 发送请求建立连接的报文,这个报文头部中包含 SYN = 1, ACK = 0 ,SEQ = x 。SYN是同步序列编号,是用来 在 TCP/IP建立链接过程中所使用的信号;SEQ 代表通信的字节流,x代表本次通信字节流的起始位置;第一次握手之后,客户端进入 SYS_SEND状态
2) 服务器在收到客户端链接请求的时候,如果同意连接,便会向客户端应答一个报文。这个报文头部中 SYN =1 ,ACK = 1, SEQ = y ,ack = x + 1; 此时 SEQ = y 代表服务器端通信字节流起点。然后服务器进入SYS-RCVD状态,等待下一次客户端发来请求
3) 客户端在收到服务器端发来的报文的时候,会继续向服务器发送一个报文,这个报文中SYN = 1 , ACK = 1 ,SEQ = x +1 ,ack = y + 1 ,表示你发的报文我已经收到了。
上述过程完事之后,客户端 和 服务器端 进入 ESTABLISHED 状态。
为什么是 三次握手 而不是 二次握手?
首先TCP通信过程是一个全双工通信,你既要保证你能听到对方的,还要保证对方能听到你。 如果是二次握手的话,服务器端在发送完信号之后,就进入了ESTABLISHED状态,但是这样并不能保证客户端就一定能收到服务器端此次发来的信号。如果没有收到这次发来的信号,客户端就会再次重复第一步的过程。然而这个时候服务端已经进入了ESTABLISHED状态,对应的这个线程/进程就一直堵在这里,浪费资源; 在加上第三次握手的时候,就可以避免这个状态
TCP四次握手
前两次作用是是客户端释放链接,后两次是服务器端释放链接
FIN 表示 关闭连接
1)客户端 向 服务器端 发送请求释放链接, 报文头部中ACK = 1,FIN = 1, SEQ = z , z 为 客户端向服务器端发送数据的最后一个字节序号 + 1,然后客户端进入 CLOSE_WAIT1 状态
2)服务器端在收到客户端发送的报文之后 , 报文头部中 ACK =1 ,FIN = 1,SEQ = w , ack = z + 1 。w为服务器端向该客户端发送数据的最后一个字节序号 + 1. 客户端在收到该报文之后,进入CLOSE_WAIT2状态
3)然后再就是服务器端向客户端发送 断开服务器端到客户端这个方向的链接。 ACK =1 ,FIN = 1, SEQ = w ,ack = z+ 1 。 然后服务器端进入了LAST-ACK这个状态
4)客户端再收到这个报文的时候 , 就进入了TIME-WAIT状态,如果在2msl的时间内,服务器端没有重发请求的话,就会向服务器端发送一个确认应答,报文头部中ACK = 1,FIN = 1, SEQ = z + 1 , ack = w +1 。