tcp连接(握手)与释放(挥手)
也许回眸之间,我们就完成了无数次的“tcp”互动,在进行“tcp”的交流中,我们都需要先建立起连接才行,而且也必须要按照双发协定好的来进行才行,这样才能保证我们是正常的交流.
tcp协议特点
可靠的交付(数据包必须要保证真的让对方收到—(收到对方确认才行))
tcp面向连接的运输层协议
全双工通信(双发的交流可同时进行,互不干扰,如同打电话,你说我也可以说)
面向字节流(接受上层应用程序发来的
字节流
,成字节流来发送的)
tcp连接的三次
握手
前提:A向B发起连接请求(A->B)
为什么要三次握手?
- 为了防止B(接受连接请求)的那一方收到A(发起请求方)的“无效连接请求(可能这个连接请求已经过期)”,而B又重新向A发送 确认同意连接,但是其实A和B的请求连接请求早已建立,正是因为建立连接需要第三次握手(A继续给B发确认B发的同意连接确认),才保证A在B收到“无效连接请求”之后向A发送同意连接确认,但是A并没有发连接请求(之前的连接已经建立了,A已经”觉察”到B是收到了无效的连接请求),所以A不会向B第三次握手,保证了这个连接(非法连接)不会正常建立—正是第三次握手保证了连接的正常。
tcp释放四次
挥手
关闭是两步走
客户端关闭发送(客户端不再向服务端发送数据),需要两次挥手
服务端关闭发送(服务端不再向客户端发送数据),需要两次挥手
执行完上面两步,才算正释放了两次连接(即双发都不能给彼此发送数据)
注意图上的状态
客户端:主动释放连接 FIN=1,seq=u,向服务端发送释放报文
服务端:发送确认报文(注意是确认报文,不是释放报文),服务端进入
关闭等待
ack=1,seq=v,ack=u+1(此时客户端不能向服务端发送数据,但服务端能给客户端发)服务端:假如服务端不再给客户端发数据,就向客户端发送释放报文,ack=1,seq=w,ack=u+1,
FIN=1
,服务端进入最后确认等待
客户端:收到服务端的释放报文,向服务端发送确认(释放)报文,(但是客户端并不能立刻关闭连接,需要等待2MSL时间,MSL是最长报文段寿命).在服务端收到客户端的确认释放报文段后,则服务端正式关闭TCP连接
为什么客户端需要等待2MSL?
为了保证客户端发送的最后一个确认报文可以到达服务端(这个报文可能会丢失)
防止“已失效的连接请求报文段”出现在本次的连接中,经过这个时间,在本连接中的所有报文段都会从网络中消失。
ps:上面就是四次握手 ,服务端比客户端先关闭连接!