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
报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。
四.GET和POST方法在请求报文中有什么不同: get方法请求体必须为空, post方法请求体可以不为空
五 TCP/IP和OSI模型对比: