TCP的三次握手和四次挥手

TCP建立连接需要三次握手
客户端向服务端发送请求报文
服务端接收到请求报文发送响应报文
客户端接收到服务端响应报文回应收到,此时这里可以传递一些消息内容了,但是注意前两次握手是不能连带消息传递
解释一下为什么需要三次握手,而不是两次
首先用户体验讲究的是效率,响应快用户体验就好
第一次握手客户端发送请求报文,浏览器接收此时服务端知道客户端发送数据正常第二次握手服务端发送响应报文给客户端,此时客户端知道服务端接收数据正常,发送数据正常但是注意这个时候服务端并不知道客户端是否接收数据正常
所以才有第三次握手,客户端发送报文给服务端,服务端才得知客户端接收数据正常
第一次握手和第二次握手是不能传递数据的,但第三次可以
在这里考虑到安全因素,因为第一次和第二次的握手不会让客户端和服务端双方都知道发送接收均正常,此时如果第一次握手就开始接收数据,假如有不法分子想搞服务器,模拟虚拟ip发送虚假请求信息,服务端就会不停的接收,会造成服务端压力剧增,最后导致服务端宕机。
在这里再补充一点所学的,其实服务端接收客户端发送的数据都是在消息队列里,假如此时大量数据发送会造成消息队列爆满,会造成正常访问的客户端因为消息队列空间不足,造成丢包.

TCP断开连接四次挥手
假如客户端先发送断开请求,(服务端一般不会去主动断开吧我觉得)
客户端发送断开请求报文给服务端
服务端接收到断开请求报文后会发送确认报文响应给客户端,此时客户端会给应用层告知客户端请求断开
应用层接收并关闭相应服务,接着服务端会发送连接释放报文给客户端
客户端接收到服务端发来的连接释放报文后,会对此法松确认报文段,然后等待2MSL关闭,服务端接收到报文后关闭
解释一下为什么要等待2MSL
因为考虑到请求的报文可能再传输过程中,发生发送失败等等,这个时候客户端会再在一段时间后再次发送,这个2MSL就是为了防止这种事情发生;假如客户端发送最后的报文后立即关闭,而此时报文在传输中丢包了,那么服务端接收不到,就会一直保持半关闭状态,无法关闭。
解释一下为什么需要四次挥手
第一次挥手是客户端告知服务端断开请求并发送ACK报文
第二次挥手客户端会响应这个请求,发送ACK报文,但此时服务端还需要告知应用层
第三次挥手是应用层关闭后服务端会告知客户端关闭报文SYN
客户端接收到后会发送最后一个ACK报文,然后会进入关闭状态,但此时它需要等待2msl再完全关闭,需要确保报文能正常发过去。
【ACK报文是用来应答的,SYN是用来同步的】
【HTTP连接三次握手图】
TCP的三次握手和四次挥手
【HTTP断开连接四次挥手图】
TCP的三次握手和四次挥手