1.TCP头部和IP头部信息
2.TCP和UDP的区别
- 知识点1:是否连接
- 知识点2:可靠性
- 知识点3:数据传输形式
- 知识点4:传输速度
- 知识点5:应用场景
3.TCP如何保证可靠性
-
相关机制:TCP分段/超时重传/流量控制/数据包校验/处理IP数据包等等
- TCP分段:应用数据被分割成合适的TCP段发送(对UDP来说,应用程序产生的数据段长度将保持不变)
- 超时重传:每发出一个TCP段都会启动一个"重传定时器";如果不能及时收到一个确认,将重传这个报文段
- 流量控制:缓冲区固定大小,TCP接收端只允许另一端发送接收缓冲区所能接纳的数据(滑动窗口)
- 数据校验:TCP首部(校验和);如果收到段的校验和有差错,会选择丢弃和不确认
- 处理IP数据包:a) 丢弃重复的IP数据包;b) 将失序的IP数据包重新排序后交
4.TCP三次握手和四次挥手
- 知识点1:握手挥手过程
- 知识点2:TCP包类型
- 知识点3:数据包携带信息
- 知识点4:有限状态机变化
5.TCP为什么采用三次握手
- 如果采用2次握手:S端如果收到已经失效的SYN连接请求后,就同意建立连接,然后开始等待C端发送数据,会导致资源极大浪费
- 如果采用4次握手:减少建立连接时间过长,影响工作效率(S端的ACK和SYN包就是一起发送的)
6.如果发送的SYN丢失会怎么办
- 相关机制:重传计时器/快速重传/SACK/D-SACK
-
重传计时器:每次发送SYN包都会启用一个重传定时器,当超时时间到来,会进行重传
- 解决:包丢失的重传问题
- 问题:timeout会导致网络利用率降低
-
计算公式1:RTO是根据RTT值而确定的
# RTTm为RTT测量值;RTTs平滑值;RTTd偏差值 RTTs=(1-a)*RTTs+a*RTTm a通常为1/8 RTTD= (1-b)*RTTD+b*|RTTm-RTTs| b通常为1/4 RTO=RTTs+4RTTD
-
计算公式2:当无法获取RTT值时
RTO=2*RTO
-
快速重传:发送端接收三个相同序号的ACK包,即立刻进行重传,并不需要重传计时器的timeout时间
- 解决:timeout问题,提高网络利用率
- 问题:收到的ACK序号及已经发送的数据包需要重新发送
-
SACK:在TCP头加上SACK用来汇报收到的数据碎片
- 解决:发送端可以根据回传回来的SACK判断需要重传数据包(Linux内核参数:tcp_sack)
- 问题:当有恶意攻击者,SACK会消耗发送端的资源
-
D-SACK: 在TCP头加上SACK,通过ACK和SACK值判断丢失的数据包
- 解决:重复收到数据问题(Linux内核参数:tcp_dsack)
- 优点:可以让发送方知道,是发出去的包丢了,还是回来的ACK包丢了
-
场景示例1: ACK包丢失问题
Transmitted Received ACK Sent Segment Segment (Including SACK Blocks) # 3500-3999包丢失 3000-3499 3000-3499 3500 (ACK dropped) 3500-3999 3500-3999 4000 (ACK dropped) # ACK > SACK -> D-SACK:只需要发送4000+的数据包 3000-3499 3000-3499 4000, SACK=3000-3500
-
场景示例2:网络延迟
Transmitted Received ACK Sent Segment Segment (Including SACK Blocks) 500-999 500-999 1000 # 1000-1499延迟 1000-1499 (delayed) # 快速重传 1500-1999 1500-1999 1000, SACK=1500-2000 2000-2499 2000-2499 1000, SACK=1500-2500 2500-2999 2500-2999 1000, SACK=1500-3000 1000-1499 1000-1499 3000 # ACK > SACK -> D-SACK: 只需发送3000+的数据包 1000-1499 3000, SACK=1000-1500
7.如果已经建立了连接,但是客户端突然出现故障了怎么办?
- TCP连接设有一个保活计时器,如果客户端出现故障,服务器不能一直等下去,白白浪费资源
-
服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2h
- 若2h还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75s发送一次
- 若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接
8.延迟确认机制
- 定义:ACK在收到数据后并不马上回复,而是等待一端时间(初始化值为40s)后,和要返回的数据一起传输,这样可以提高网络利用率和减少带宽消耗
-
分类:Linux中存在延迟ACK和快速ACK
- 延迟ACK能够减少发送的分段从而节省带宽
- 快速ACK能够及时通知发送方丢包,提升吞吐率,避免滑动窗口停等
9.TIME_WAIT相关问题
9-1.TIME_WAIT状态用来解决和避免的问题
- 防止主动关闭方的ACK包丢失问题
- 防止重复(旧)的数据包出现在本次连接问题
9-2.集群中处于TIME-WAIT状态的服务器过多的原因?
- 原因1:高并发短链接的TCP服务器上,当服务器处理完请求后正常主动关闭连接
- 短链接:“业务处理+传输数据时间”远远小于TIME-WAIT时间
- 场景1:1s的http短链接处理完业务,主动方关闭连接之后,会在T-W状态等待2MLS时间从而导致端口被占用
9-3.如何处理TIME-WAIT过多的问题
-
Linux系统调优
# /etc/sysctl.conf文件中: net.ipv4.tcp_tw_reuse=1 # 重用 net.ipv4.tcp_tw_recycle=1 # 快速回收 net.ipv4.tcp_tw_timestamps=1 # 时间戳一致 net.ipv4.tcp_syncookies = 1 # SYN请求缓存(有一点点用处)
9-4.清理TIME-WAIT技巧
- 调整 net.ipv4.tcp_max_tw_buckets 参数;当超过默认值时内核会把过多的T-W连接清理掉
- 利用RTS包从外部清理,当内核收到RTS包后会产生错误从而终止连接
10.滑动窗口
10-1.相关问题
- 发送方根据接收端的窗口大小(WIN=xxx)来调整发送速率,实现端到端的流量控制
- 窗口: |已发送并确认|发送窗口|不允许发送|
- 发送窗口: |通知窗口:已发送并未收到确认|可用窗口:允许发送但未发送|
- 发送缓存:ad) TCP已发送但是没有收到确认的数据;b) 应用程序:TCP准备发送的数据
- 接收缓存:a) 未按序到达的数据;b) 应用程序:按序到达并未读取的数据
-
发送缓存和接收缓存都有大小限制,并可以重复使用
-
Linux系统相关内核参数:
# 自动调节: net.ipv4.tcp_moderate_rcvbuf=1 # 默认为1:代表开启自动调节 net.ipv4.tcp_adv_win_scale=1 # 默认为1:计算接收缓存和接收窗口的微调 net.ipv4.tcp_wmem=4096 16384 4194304 # min值 defaults值 max值 net.ipv4.tcp_rmem=4096 87380 6291456 # 发送和接收缓存的默认值和最大值: net.core.rmem_default=212992 net.core.rmem_max=212992 net.core.wmem_default=212992 net.core.wmem_max=212992
-
10-2.如果发送端接收到一个零窗口该怎么处理?
- 场景:当服务端处理能力不够的时候,可能会导致数据丢失,从而向发送端发送零窗口
-
发送端处理方式:
- 会暂时停止发送数据流
- 启用窗口定时器:当网络中没有发送且未确认的数据包且本端有待发送的数据包时
-
保持连接并传输探测(keep-alive报文)
- 接收窗口不为0:继续发送数据包(清除超时时间的退避指数,删除零窗口探测定时器)
- 接收窗口仍为0:重新设置零窗口探测定时器的下次超时时间,超时时间的设置和超时重传定时器的一样
11.拥塞控制
网络拥塞的原因:
- 独享整个网络资源,TCP的流量控制必然会导致网络拥塞,只关注了对端接收空间,无法知道链路上的容量
- 路由器接入网络会拉低网络的总带宽,路由器如果出现瓶颈,很容易出现堵塞
- 拥塞控制主要依赖于拥塞窗口(cwnd);所以发送端发送的真正窗口是:min(rwnd,cwnd)
- 拥塞控制的4种机制:慢开始/拥塞避免/快速重传/快速恢复
-
拥塞控制过程:
- 慢启动: 进行试探的过程 -> 一般从cwnd=1开始加倍增长
- 当cwnd > ssthresh初始值后开始拥塞避免-> 每次cwnd+1
- 判断网络拥塞
a) 没收到ACK时,重新执行慢开始,并且将sshresh初始值重置为: 发生拥塞时的cwnd/2
b) 收到3个重复ACK时,进行快速重传, - 快速恢复: 从新ssthresh=[ 发生拥塞时的cwnd/2 ]开始执行拥塞避免
12.其他相关问题
-
子网掩码的作用
- 确定网络地址和主机地址
-
北京一个站点ping广东的RTT在什么量级?描述什么样的时延?
- 传输延迟
- RTT = (2200km)/(2*10^5 km/s)*2
-
ping和traceroute的工作原理
- ping原理: 发送ICMP回显请求报文,等待ICMP响应报文
- traceroute原理:通过封装一份UDP依次将TTL值置为1/2/3...;并发送给目的主机;当收到的响应报文目标地址是自己是就说明找到目标主机
-
如何防御SYN DDOS攻击
- Linux内核参数调优
- IPtables限制TCP连接频率
- 智能DNS分流
-
STP生成树协议
- 作用:保证链路冗余的同时避免环路带来的广播风暴问题
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。