目录
1.TCP/IP 三次握手
TCP/IP 三次握手过程
主要依靠IP协议报文中的 SYN ACK 两个标识位,SYN 表示是请求连接的报文,ACK 表示确认报文的请求
过程:
- 客户端处于 CLOSE 状态,服务器处于 LISTEN 状态,客户端向服务器发送请求连接报文,SYN=1 seq=x,发送成功后,客户端状态修改为 SYN_SEND 状态
- 服务器接收到客户端的请求报文,就发送 ACK 确认报文,表示服务器接收到了这个请求,ACK=1 syn=y ack=x+1 服务器将状态为 SYN_RCVD 状态
- 客户端收到服务器发送的确认报文后,到这里,客户端知道服务器接收和发送功能都没有问题,但是服务器只知道客户端有发送功能,所以有第三次握手,
- 客户端发送确认报文,ACK=1 ack=y+1 seq=x+1 ,这里seq=x+1 可以用来标识第一次连接的握手,到这里客户端处于 ESTABLISHED 状态
- 服务器收到客户端的确认报文后,知道了客户端收发能力没问题,将状态修改为 ESTABLISHED 状态,连接建立成功,可以开始发送消息了
为什么是三次握手?
- 确认客户端与服务器之间都有收发功能。
- 如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,
客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,
此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,
此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。
半连接队列和全连接队列
- 对于状态为 SYM_RCVD 的状态,服务器会将这个连接加入到半连接队列中,等待客户端发送数据,当三次握手完成,服务器会将这个连接加入到全连接队列中
- 全连接队列,顾名思义就是指完成三次握手的连接,如果队列满了就会出现丢包的情况
ISN(initial sequence number)是否是固定的吗?
ISN 是一个随机数(本质是32位的一个计数器),用来标识

最低0.47元/天 解锁文章
1万+






