tcp相关问题

213 阅读3分钟

tcp相关问题

1.linux下相关配置文件

内核、网络配置文件

vi /etc/sysctl.conf

/proc/sys/net/XXX

sudo sysctl -p

1.如果syn包超时会发生什么?

超时会重传,重传的时候会采用指数退避,下次的RTO是上次的两倍。

RTO在RFC6298中,定义为1秒。在RFC 1122中,该值为3秒。

  1. 根据linux下的/proc/sys/net/ipv4/tcp_syn_retries文件确定重传次数。
  2. 应用程序的socket指定了tcp的TCP_SYNCNT重传次数
  3. 应用程序主动断开,不再重传

2.为什么是3次握手

S需要确认C受到应答,如果只有两次,会导致S最后一个报文在丢失的情况下,不断重传。而C由于未建立链接,也会不断重传syn报文。但这种情况下,协议并没有定义这种情况S怎么处理,但是可行的方案有,1.归到前面建立的稳定链接上,会导致连接被劫持的问题,很严重。2.断开之前的连接,也是很严重的问题。

双方要建立稳定的连接,才可以协商管理这个链接的生命周期。需要是一个确定的状态。

3.为什么是4次挥手

有一段可能还有消息有发。

4.为什么是2MSL

如果S没有收到报文,会重传自己的FIN,这个时间在所以需要保证2MSL的等待时间,主要是为了保证S收到了ACK

5.如果稳定建链,有一端退出怎么办

net.ipv4.tcp_keepalive_time:发送探测报文之前的链接空闲时间,默认为7200s。 net.ipv4.tcp_keepalive_intvl:两次探测报文发送的时间间隔,默认为75s。 net.ipv4.tcp_keepalive_probes:探测次数。

6.tcp的滑动窗口

  1. 报文中的窗口字段有16位,也就是2的16次方,65535字节。

再乘以窗口缩放因子有14位,也就是2的14次方

  1. 这个字段在syn报文中指定,由于告诉对端自己的接收窗口大小

  2. 发送窗口只有在对端收到应答之后才滑动,通过本端的收到的ack确认对端收到应答。

  3. 如果自己的窗口满了,发送一个0窗口报文,恢复了再发一个恢复的报文,实现流量控制。

7.tcp拥堵控制

包括 慢启动()、拥塞避免、快速重传、快速恢复 这4方面

发送窗口

发送方窗口的上限值 = Min [ rwnd, cwnd ]

当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值。

当cwnd < rwnd 时,则是网络的拥塞限制发送方窗口的最大值。

8.可靠传输

  1. 停止等待协议:接受到应答才发送下一个报文。

超时时间应设置得比平均往返时间长一点、当不能太多,为了效率。

连续ARQ和停止等待协议

SACK,给出一个左边界和右边界,告知发送端还有哪些报文没有收到

  1. 确认丢失和确认迟到:C没有收到应答就重传,S收到重复应答丢弃并回复(如果不回复,在自己的应答丢失的场景下有问题),C如果收到两个应答就丢弃后面那个。