TCP协议的三次握手和四次挥手
三次握手
三次握手,建立连接。
- 第一握手,客户端向服务端发送建立连接的请求
- 第二次握手,服务端如果同意连接,向客户端发送应答
- 第三次握手,当客户端收到同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发送来的连接同意应答已经成功收到了
反馈机制
客户端往服务端发送请求,服务端必须返回响应,告诉客户端收到了请求,并且将服务器端的数据一并返回给客户端。
ps:即一次请求,必须要有一次响应
缺点:
- 洪水攻击
- 指的是通过伪造大量的请求,往对方服务器上发送请求,导致对方服务器响应跟不上,以至于瘫痪。
- linux系统内部可以调整sysctl.conf文件里的
net.ipv4.tcp
参数抵挡较小的Dos攻击。(详情链接:https://www.cnblogs.com/cnhyk/p/11990401.html) - 半连接池
listen
:限制用户在同一时段内的访问数量。
第一次握手
客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,seq=x。请求发送后,客户端便进入SYN-SENT状态。
- PS1:SYN=1,ACK=0表示该报文段为连接请求报文。
- PS2:x为本次TCP通信的字节流的初始序号。
- TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号。
第二次握手
服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。
该应答发送完成后便进入SYN-RCVD状态。
- PS1:SYN=1,ACK=1表示该报文段为连接同意的应答报文。
- PS2:seq=y表示服务端作为发送者时,发送字节流的初始序号。
- PS3:ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。
第三次握手
当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。
报文段的头部为:ACK=1,seq=x+1,ack=y+1。客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!
为什么连接建立需要三次握手,而不是两次握手?
防止失效的连接请求报文段被服务端接收,从而产生错误。
PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。
若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。
作者:大闲人柴毛毛
链接:https://www.zhihu.com/question/24853633/answer/254224088
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
四次挥手
四次挥手,断开连接。
- 客户端向服务器发送断开连接的请求
- 服务端返回收到请求的信息给客户端
- 服务端确认所有的数据接收完成以后,再发送给同意断开连接的请求给客户端
- 客户端返回收到断开连接的请求,给服务端