一个sxf的面试题

TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。


image.png

准备

TCP服务器先创建传输控制块TCB,时刻准备接收客户进程的连接请求,此时服务器处于LISTEN(监听)状态,客户端处于CLOSE(关闭)状态。

TCB传输控制块包含了数据发送双方对应的socket信息以及拥有装载数据的缓冲区。 在两个设备在建立连接之前,双方都必须要做一些准备工作,分配内存建立起TCB传输控制块就是连接之前必须要做的工作。

连接

第一次握手:客户端给服务器发送一个同步报文段SYN,并指定客户端的初始序列号ISN,此时客 户端处于SYN_SENT状态。
首部的同步位SYN = 1(SYN只是一个比特位,0表示不是SYN,1表示是SYN),初始序列号seq = m。
SYN = 1的报文段不能携带任何的数据,但要指定序号。

第二次握手:服务器接收到来自客户端的同步报文段SYN后,会以自己的SYN报文作为应答, 并且也指定了自己的初始序列号ISN。同时会把客户端的 seq+1 确认序列号ack的值,表示自己已经收到了客户端的同步报文段SYN,此时服务器处于SYN_RCVD的状态。
确认报文段中SYN = 1,ACK = 1(ACK也只是一个比特位,0表示不是ACK,1表示是ACK),确认序列号ack = m+1,初始序列号seq = n。

第三次握手:客户端收到来自服务器的同步报文段SYN之后,会发送一个确认报文段ACK,以服务器的 seq+1作为ack的值 ,表明自己已经收到来自服务器的同步报文段SYN。客户端进入ESTABLISHED状态,服务器确认报文段ACK之后,也会进入ESTABLISHED状态。
确认报文段中,ACK = 1,确认序列号 ack = n+1,序列号 seq = m+1。

双方已经建立起连接,可以正常的发送数据。

能把三次握手改为两次握手吗? 不行,第三次握手是为了防止失效的请求连接到达服务器,让服务器错误的打开连接。