1.tcp头部格式:
序列号:用来解决网络包收发的顺序问题
确认应答号:解决丢包问题(一般都是+1)
2.建立一个 TCP 连接是需要客户端与服务端达成上述三个信息的共识
Socket:由 IP 地址和端口号组成(IP源地址,源端口,IP目的地址,目的端口)
序列号:用来解决乱序问题等
窗口大小:用来做流量控制
3.TCP/UDP区别
UDP头部格式:
1.连接:TCP需要连接,UDP不需要连接
2.对象个数:TCP是一对一,UDP可以是一对一,一对多,多对多
3.可靠性:TCP数据可以无差错、不丢失、不重复、按序到达,UDP不保证数据可靠交付
4.拥塞控制、流量控制:TCP有拥塞控制、流量控制,UDP没有
5.首部开销:TCP首部是可变的,一般20个字节(160位);UDP长度不变8个字节
4.TCP可以和UDP共用一个端口
5.TCP三次握手
6.为什么是三次握手,不是两次或者四次?
主要原因:为了防止历史连接
7.什么每次建立 TCP 连接时,初始化的序列号都要求不一样呢?
主要原因:为了防止历史报文被下一个相同四元组的连接接收
8.MSS和MTU
MTU=IP头部+TCP头部+MSS
9.第一次握手消失了会发生什么?
超时重传:
在 Linux 里,客户端的 SYN 报文最大重传次数由 tcp_syn_retries内核参数控制,这个参数是可以自定义的,默认值一般是 5。
第一次超时重传是在 1 秒后,第二次超时重传是在 2 秒,第三次超时重传是在 4 秒后,第四次超时重传是在 8 秒后,第五次是在超时重传 16 秒后。没错,每次超时的时间是上一次的 2 倍。
总共加起来大约在一分钟左右。
10.第二次握手消失了会发生什么?
双方互相认为没收到,都开始重传
11.第三次握手消失了会发生什么?
ACK 报文是不会有重传的,当 ACK 丢失了,就由对方重传对应的报文。
所以是服务端重传syn+ack报文
12.四次挥手
13.为什么TIME_Wait需要2MSL?
在我理解看来就是因为如果最后一次的ACK报文丢了,就可以在2MSL时间内收到重传的FIN报文
在 Linux 系统里 2MSL 默认是 60 秒,那么一个 MSL 也就是 30 秒。