TCP和UDP的区别
这里没写文字描述,使用表格比较清晰
| UDP | TCP |
---|
建立连接 | 不需要 | 需要 | 数据量 | 小 | 大 | 速度 | 快 | 慢 | 安全 | 不安全 | 安全 | 面向 | 报文 | 字节流 | 流量控制 | 无 | 有 | 拥塞控制 | 无 | 有 | 全双工通信 | 不支持 | 支持 |
TCP三次握手的图
最好画个图在用文字描述建立连接的过程
- SYN: 建立连接的标志位,一般是0和1两种状态,1是建立连接
- ACK: 确认标志位,一般是0和1两种状态,1是确认
- seq:序列号,占4个字节,用来标记数据段的顺序
- ack:确认号,占4个字节,期待收到对方下一个报文段的第一个数据字节的序号
UDP四次挥手的图
- FIN: 释放连接的标志位,一般是0和1两种状态,1是释放连接
为什么要进行第三次握手
有的时候问的是为什么要进行第三次握手,两次握手不就够了吗
- 原因:考虑到网络延迟问题,创建连接的请求在网络差的情况下等待超时时,会重新发送一个创建连接的请求,但是最后两个请求都会到达服务器,那么就会造成失效的请求到达服务器再次创建连接
- 第三次握手的作用:屏蔽掉失效的请求连接到达服务器
为什么要进行四次挥手
- 第一次挥手: 主机发送释放连接的请求,这时主机不再向服务器传输数据了
- 第二次挥手:服务器接收到主机释放连接的请求,然后发送确认返回给主机,这时服务器将为传输完的数据传输给主机
- 第三次挥手:服务器发送释放连接的请求给主机,此时服务器不在传输数据给主机了
- 第四次挥手: 主机接收到服务器释放连接的请求,发送确认报文后并不是直接进入关闭连接的状态,而是进入time-wait状态,在这个状态下有计时器设置的2MSL的时间
- TIME-WAIT的2MSL的作用
- 确认主机的确认报文到达服务器,否则服务器会再次发出释放连接的请求
- 让本次连接所有的报文从网络中清除,使得下一次连接不会出现旧的报文
什么是TCP滑动窗口
是缓存的一部分,用来存放字节流,发送方和接收方都有一个窗口,发送方会根据TCP窗口字段告诉发送方自己窗口的大小,发送方根据窗口字段等信息设置滑动窗口的大小
- 发送窗口左部分的字节在发送并收到确认后,会向右移动一段距离,直到右侧最后一个字节发送并接收到确认为止
- 接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
流量控制是干什么的
流量控制是控制发送速率的,如果发送方发送过快,接收方就会接收不过来
- 接收方可以通过控制TCP滑动窗口的字段大小控制发送速率,如果窗口字段为0,发送方就不会发送数据
什么是TCP拥塞控制?
拥塞控制主要是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载;拥塞控制简单点来说就是接收方处理不过来发送方发送的数据,从这点看有点像流量控制,但是流量控制是单纯的通信量的控制,而拥塞控制针对是全局性的控制过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素;流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
原因:网络拥塞会导致分组丢失,分组丢失会导致重传,重传会导致更严重的网络拥塞
解决TCP拥塞控制的四个算法:慢开始、拥塞避免、快恢复和快重传
接收方会维护一个叫做拥塞窗口(cwnd)的状态量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
慢开始和拥塞避免
在最开始cwnd值为1,发送就会发送1个报文段,当收到确认后,cwnd就会加倍2、4、8、16…,为了避免cwnd不断增长,呈指数增长,造成网络拥塞,会设置一个慢开始的门限ssthresh, 当cwnd>ssthresh,cwnd会+1,呈线性增长,限定x个拥塞窗口时超时(快重传),超时后ssthresh=cwnd/2,cwndc=1,有些题目会让我们计算n次传输时,拥塞窗口的数量
快重传和快恢复
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。
在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh
|