4. 计算机网络 校招复习(持续更新~)
TCP
TCP 数据段结构
序列号、确认号以及标志位含义
-
序列号 seq (Sequence Numbers):用来标识从 TCP 源端向目的端发送的字节流,发起方发送数据时对此进行标记。
-
确认号 Ack (Acknowledge Number):在接收端,用来通知发送端数据成功接收;其数值等于发送方的序列号 seq + 1(即接收方期望的下一个序列号);
一般用法为:接收到的上一次远端主机传来的 seq 然后 +1,再发送给远端主机,提示远端主机已经成功接收上一次所有数据。
-
标志位:
- ACK: 确认序列号有效,确认值 ACK 为 1 便是确认连接
- SYN: 创建一个连接
- FIN: 终结/关闭一个连接
一般 确认号(Acknowledgement Number) 用小写
Ack表示,标志位的 确认值(Acknowledgement) 用大写ACK表示。
常见面试题
TCP 三次握手描述?
每个状态的含义:
CLOSED—— 没有任何连接状态;LISTEN—— 侦听来自远方 TCP 端口的连接请求;SYN_SEND—— 在发送连接请求后等待匹配的连接请求;SYN_RCVD—— 在收到和发送一个连接请求后等待对连接请求的确认;ESTABLISHED—— 代表一个打开的连接,数据可以进行传输。
为什么 TCP 握手要三次,一、两次不行吗?
-
主要是为了防止已失效的连接请求报文段突然又传到了服务器端,因而产生错误。
三次握手其实就是一个双方都确认自己与对方接收与发送能力是否正常的过程。
第一次握手:客户端发送网络包,服务端接收到了。此时服务端就可以知道:客户端发送能力正常、服务端的接收能力正常。第二次握手:服务端发包,客户端接收到了。此时客户端就可以知道:客户端自己的接收和发送能力正常、服务端的接收和发送能力正常。但是这个时候服务端并不能确定客户端的接收能力是否正常,因此我们还要进行第三次握手。第三次握手:客户端发包,服务端接收到了。此时服务端就可以确认:客户端的接收和发送能力正常、服务端自己的接收和发送能力也正常。因此,需要三次握手才能确认双方的接收与发送能力是否正常。
-
现假定一种异常情况:
Client发出的第一个连接请求报文并没有丢失,而是在某些网络节点长时间滞留了,以致延误到连接释放后的某个时间才到达Server。本来这是一个早已失效的报文段,但
Server收到此失效的连接请求报文段后,就误以为是Client又发出一次新的连接请求,于是就向Client发出确认报文段,同意建立连接。假定不采用第三次报文握手,那么只要
Server发出确认报文,新的连接就建立了。由于现在
Client并没有发出建立连接的请求,因此不会理睬Server的确认,也不会向Server发送数据,但Server却以为新的连接已经建立了,并一直等待Client发来的数据。Server的很多资源就这样白白浪费了。采用三次握手,可以防止上述现象的发生。例如在刚才的异常情况下,
Client不会向Server的确认发出确认,Server由于收不到确认,就知道Client并没有要求建立连接,于是Server就不会再建立连接。
TCP 四次挥手描述?
每个状态的含义:
ESTABLISHED—— 代表一个打开的连接,数据可以进行传输。FIN_WAIT_1—— 等待远程 TCP 的连接中断请求,或先前的连接中断请求的确认;FIN_WAIT_2—— 从远程 TCP 等待连接中断请求;CLOSE_WAIT—— 等待从本地用户发来的中断请求;LAST_ACK—— 等待原来发向 TCP 的连接中断请求的确认;TIME_WAIT—— 等待足够的时间以确保远程 TCP 接收到连接中断请求的确认;CLOSED—— 没有任何连接状态;其他标识的含义:
MSL—— 指一个片段在网络中最大的存活时间;2MSL—— 一个发送和一个回复所需的最大时间,两倍的MSL(Maximum Segment Lifetime)。
为什么 TCP 握手是三次,挥手却要四次?
-
因为(握手时)当 Server 端收到 Client 端发来的
SYN报文后,是可以直接发送SYN + ACK报文的(其中SYN报文是用来同步的,ACK报文是用来应答的)。 -
但是挥手(即关闭连接)时,当 Server 端收到 Client 端发来的
FIN报文通知时,它仅仅表示对方没有数据发给 Server端 了,并不代表 Server 端已经把所有数据都全部发送给 Client 端。所以 Server 很可能并不会立即关闭
Socket,只能先回复一个ACK报文告诉 Client 端:“你发的FIN报文我收到了”。只有等我 Server 端所有报文都发完了,我才能发送FIN报文告诉 Client 我现在可以关闭连接了。因此
FIN和ACK不能一起发送,故需要四次挥手。
为什么 TCP 挥手 TIME_WAIT 状态要有 2 MSL 等待延迟?
-
为了保证发送最后一个 ACK 报文段能够到达服务端。
场景
对应这样一种情况:
假定网络是不可靠的,导致最后客户端发送
ACK = 1给服务端的过程中丢失了,服务端没收到,服务端怎么认为的?“我已经发完数据了,怎么客户端没回应我?是不是中途丢失了?”。然后服务端再次发起断开连接的请求FIN = 1, ACK = 1,一个来回就是2MSL。所以**
TIME_WAIT状态就是用来重发可能丢失的 ACK 报文**。一些说明
关于
2MSL的说明:客户端给服务端发送的
ACK = 1丢失,服务端等待1MSL没收到,然后重新发送消息FIN = 1, ACK = 1需要1MSL。如果客户端再次接收到服务端的消息,则重启
2MSL计时器,发送确认请求。客户端只需等待
2MSL,如果没有再次收到服务端的消息,客户端就推断服务端已经接收到自己确认消息,然后结束 TCP 连接。 -
防止
已失效的连接请求报文段出现在本连接中。
TCP 和 UDP 的区别?
- TCP面向连接,UDP是无连接的(即发送数据前不需要建立连接);
- TCP提供可靠传输,保证数据准确性,UDP可能会丢包;TCP保证数据顺序,UDP不保证;
- TCP是面向字节流,而UDP是面向报文的(流模式和数据包模式)
网络分层模型
OSI七层模型、五层模型和TCP/IP四层模型的关系如下: