TCP/IP的一些面试问题

2021/12/6 23:48:00

本文主要是介绍TCP/IP的一些面试问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一..有一个 IP 的服务器监听了一个端口,它的 TCP 的最大连接数是多少?

对 IPv4,客户端的 IP 数最多为 2 的 32 次方,客户端的端口数最多为 2 的 16次方,也就是服务端单机最大 TCP 连接数,约为 2 的 48 次方。

但是远远达不到,因为: 

  • 首先主要是文件描述符限制,Socket 都是文件,所以首先要通过 ulimit 配置 文件描述符 的数目;

  • 另一个是内存限制,每个 TCP 连接都要占用一定内存,操作系统内存是有限的。

 

二..为什么 UDP 头部没有「首部长度」字段,而 TCP 头部有「首部长度」字段呢?

原因是 TCP 有可变长的「选项」字段,而 UDP 头部长度则是不会变化的,无需多一个字段去记录 UDP 的首部长度。

 

三..为什么 UDP 头部有「包长度」字段,而 TCP 头部则没有「包长度」字段呢?

TCP数据的长度= IP 总长度-IP首部长度-TCP首部长度

因为为了网络设备硬件设计和处理方便,首部长度需要是 4字节的整数倍。

如果去掉 UDP 「包长度」字段,那 UDP 首部长度就不是 4 字节的整数倍了,所以觉得这可能是为了补全 UDP 首部长度是 4 字节的整数倍,才补充了「包长度」字段。

 

3.5 概念

TCP 三次握手过程和状态变迁

1. 客户端 发送 SYN给 服务器端  (客户端表明自己要向你服务器端发送连接请求啦,这是我的随机序号client_isn)

2. 服务器端 发送 SYN+ACK给客户端  (服务说,我收到了,还给你client_isn+1; 这是我的随机序号server_isn,如果你也收到了,就发吧)

3.客户端  发送ACK 给服务器端  (客户端说,我也收到了,还你 server_isn+1. 我的状态是 ESTABLISHED) ps:服务器端收到后也变为ESTABLISHED

 四..为什么要三次握手?而不是两次?四次? 

  • 三次握手才可以阻止历史重复连接的初始化(主要原因)

在拥堵的网络中, 旧的SYN比新的SYN先到达,那么服务器端返回给客户端的是  旧SYN+1,那么客服端发现后就发送 RST请求 中断连接; 直到双反都收到正确的数据才建立连接. 

  • 原因二:同步双方初始序列号

TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素,它的作用:

1接收方可以去除重复的数据;2接收方可以根据数据包的序列号按序接收;3可以标识发送出去的数据包中, 哪些是已经被对方收到的;

而双方的SYN中携带这个  初始序列号 信息, 只有一来一回才能保证两者都收到的是正确的. 

  • 原因三:避免资源浪费

如果只有「两次握手」,当客户端的 SYN 请求连接在网络中阻塞,客户端没有接收到 ACK 报文,就会重新发送 SYN ;

就算服务器端收到了, 但是客户端也不知道啊,而且由于没有第三次握手,服务器不清楚客户端是否收到了自己发送的建立连接的 ACK 确认信号,所以每收到一个 SYN服务器端 就只能先主动建立一个连接.

这会造成什么情况呢?

如果客户端的 SYN 阻塞了,重复发送多次 SYN 报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。



这篇关于TCP/IP的一些面试问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程