一、TCP的三次握手
第一次握手:你能和我建立连接吗,可以接受到我的数据吗。
SYN = 1 ,seq = x
第二次握手:可以建立连接,我接受到你的请求了,能接受到我的数据吗,你的数据是这个吗
SYN = 1 ,ACK = 1 ,seq = y ,ack = x + 1
第三次握手:我已经收到你的回复,这是我的数据,这是你的数据(用于再次核对)
ACK = 1 ,seq = x + 1 ,ack = y + 1
建立连接成功。
1、具体说明
<1>第一次握手由客户端发送SYN(同步连接请求)和自己的seq;
<2>第二次握手由服务端收到客户端发送的SYN后回复ACK=客户端SYN+1,并发送自己的SYN;
<3>第三次握手由客户端发送ack已确认收到服务器的SYN,从而完成连接。
2、为什么 TCP 握手需要三次?
不用一次握手是因为TCP是面向连接的传输机制,是双向的,仅靠一次握手无法完成最基本的连接,所以一次握手肯定不可以;
假设需要两次握手,当客户端发送SYN给服务端时,如果因为网络延时或者其他原因导致该信息服务端没有收到,这时客户端迟迟未收到服务端发送的ACK回复,就会继续给服务端发送SYN连接请求,此时若服务端能正常收到该SYN并且回复ACK给客户端,二者建立连接,之后某个时间点,服务端收到了第一个SYN,会认为只是一个链接请求,就会回复客户端,而客户端知道自己已经完成了链接并且不需要该ACK,就会将其丢弃,而服务端则会持续发送ACK,造成网络资源的占用和浪费;上述现象的根源在于服务器不知道这是一个无效连接,而三次握手就可以解决这个问题,第二次服务端向客户端回复ACK+SYN时,服务器知道服务端还必须回复一次确认,如果没有收到该确认,证明这是一个无效的连接,将释放连接,重新建立连接,故采用三次握手机制。
所谓的"三次握手"即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。为了防止失效的连接请求报文段突然又传送到主机服务端 ,因而产生错误。
二、TCP的四次挥手
1、过程:
<1>第一次挥手:A数据传输完毕需要断开连接,A的应用进程向其TCP发出连接释放报文段(FIN = 1,序号seq = u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1状态,等待B的确认。
<2>第二次挥手:B收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT关闭等待状态,此时的TCP处于半关闭状态,A到B的连接释放。而A收到B的确认后,进入FIN-WAIT-2状态,等待B发出的连接释放报文段。
<3>第三次挥手:当B数据传输完毕后,B发出连接释放报文段(FIN = 1,ACK = 1,序号seq = w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A 的最后确认。
<4>第四次挥手:A收到B的连接释放报文段后,对此发出确认报文段(ACK = 1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSE状态。
2、为什么 TCP 的挥手需要四次?
因为TCP是全双公的,要实现可靠的连接关闭,A发出结束报文FIN,收到B确认后A知道自己没有数据需要发送了,B知道A不再发送数据了,自己也不会接收数据了,但是此时A还是可以接收数据,B也可以发送数据;当B发出FIN报文的时候此时两边才会真正的断开连接,读写分开。
三、可靠机制详解
TCP的可靠传输通过确认、排序、流控、重传四种传输机制来保证。
1、确认:当TCP收到来自TCP连接另一端的数据后,将给对端发送一个确认信息,这个确认信息并不是立即发送的,通常情况下会延迟几分之一秒。
2、排序:TCP报文段作为IP数据报来传输,由于IP数据报的到达可能会失序,因为TCP报文段的到达也可能会失序。如果必要的话,TCP将对收到的数据进行排序,将收到的数据以正确的顺序交给应用层。
3、流控:TCP连接的每一方都有固定大小的缓存空间。TCP的接收端只允许另一端发送接收端缓冲区能接纳的数据。这将防止发送较快主机引起发送较慢主机的缓冲区溢出现象。
4、重传:当TCP发出一个报文段后,会对该报文段启动一个定时器,等待目标端确认收到这个报文段。若在计时内收不到确认信息,就会重新发送这个报文段。