1.UDP为什么没有首部长字段
UDP首部固定是8个字节为了节省长度所以解析时直接解析前8个字节就行
多少就是TCP为什么有首部长因为TCP除了前20个字节的固定首部还有可变首部服务端要解析首部必须要知道具体首部长度
TCP的数据长度是用IP数据报的长度-TCP首部-IP首部
UDP直接给出了UDP总长度
2.TCP连接数量限制?
一条TCP连接是用(源IP,源端口号,目的IP,目的端口号,协议) 五元组成理论上可以有2^32条连接是无限的 然而每个连接需要创建一个socketfd在linux中fd的数量是有限制的 三次握手中会有连接队列的大小限制如何连接数量超过队列限制会丢弃该连接 内存限制每个socketfd会有读写缓冲区大小如果总的缓冲区大小不因该超过内存限制
3.为什么IP层分片TCP层也会分片?
1.IP分片当IP层的内容超过了MTU(链路层的数据部分) 由标识 标志 片偏移实现
通过分片的每个标识是相同的 标志MF表示后面有分片 DF表示是否能够分片 片偏移表示中间分片距离起始位置的距离以8字节为单位 路由器需要进行重组
由上层应用进行确定的。就是2.TCP分片 MSS表示最大传输单元始终控制在MTU以下避免了IP分片 选择重传某个包丢失不会传输所有的数据包只会传输丢失的数据包 TCP的分片协议
IP分片一般用于UDP或者MTU骤减时
MSS通过三次握手进行协商一般选择MSS较小的来作为MSS 也可以是不对称的 每次发送都会重新计算MSS MSS在可选字段上进行传输
4.TCP如何解决粘包和拆包的疑问?
发送方发送过快接受方来不及处理(面对字节流)或者网络层合并段
解决采用定长消息 或者使用分隔符 或者采用长度字段。
5.为什么TCP需要三次握手?
通过否收到自己的确认报文就是假如是两次连接发送方能够确认接收方已经收到自己发送的SYN 但接收方不能确认发送发
不用四次是因为将ACK和SYN两次通信进行合并
假如某个报文丢弃会触发超时重传 发送方或者接收方宕机会触发退避算法进行重发
6.为什么每次序号要不同?
(1) 避免和旧连接数据序号相同造成数据错乱 (2)避免网络攻击
7.SYN泛洪怎么解决?
(1)增大半连接队列的限制减少连接超时时间 (2)只在全连接时才分配状态
(3)用防火墙或者中间件进行过滤
8.为什么需要四次挥手?
断开连接时发送和接受需要在不同时间关闭所以需要进行四次
9.除了四次挥手还有RST关闭方式直接在TCP的报文中设置RST为1重置连接
10.为什么必须TIME_WAIT?
避免结果一次ACK丢失后必须对端进行重传 所以要求等待2MSL才能关闭
避免网络中有旧连接的包被新连接包所识别会造成数据错乱
11.TIME_WAIT过多?
频繁的进行连接的建立和断开由于需等待2MSL的时间才关闭连接 所以会占用端口和内存 导致内存和端口不够
解决的方式:用链接池 KEEP-LIVE
12.如果TIME_WAIT期间收到新的SYN会怎么样?
会丢弃SYN报文并发送RST 重置连接 在TIME_WAIT期间只能收到重发的FIN报文
13.如果发生断电或者进程崩溃会发生什么?
服务器会持续重发直到达到内核参数限制后停止重发
进程崩溃后如果没有调用close则会由操作系统调用发送FIN 假设调用了CLOSE 则会直接发送RST进行连接重置
14.TCP如何保证可靠传输?
1.字节流分段与序列号 2.校验和 3.累计确认和超时重传 4.流量控制 5.拥塞控制
慢开始(ssthresh) 拥塞避免 快重传和快恢复
15.SACK告诉发送方那些已经收到避免只能确认接收到的最前面的一块
16.流量控制:接受方会告诉发送方自己剩余的缓冲区大小 发送方会根据窗口大小和拥塞窗口大小调整自己的窗口大小
17.TCP KEEP-ALIVE和 HTTP-KEEP-ALIVE的区别?
对于TCP而言每次发送一个探测报文查看对端是否活跃如果没有收到答复则发送N次之后断开连接倘若收到答复则计数器重新计算
重复利用TCP连接避免三次握手和四次挥手的开销就是对于HTTP而言
18.TCP协议有什么缺点?
三次握手期间能够在第一次握手后携带数据将握手和加密结合在一起
按照时延调控速率而非丢包率
采用多路复用的方式来计算减少握手阻塞
19.调用send并不能保证数据已经传输成功只能保证数据写入了内核缓冲区

posted on 2025-10-10 18:17  ycfenxi  阅读(8)  评论(0)    收藏  举报