大家好,又见面了,我是你们的朋友全栈君。
主要解决网络包乱序(去重)的问题(接收方更加关心)
主要解决不丢包的问题(发送方更关心)
带外数据(OOB:out of band)
,不要按原来的排队顺序发送,会把数据紧急插入到本报文段的最前面,这时就和后面的的16位紧急指针配合使用,可以理解为一种数据的插队机制
窗口字段明确指出了现在允许对方发送的数据里量
sendto
会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作(这个面试可能会问)
SACK
方法窗口
的概念,即使往返时间长,也不会降低效率接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 "窗口大小" 字段, 通过ACK端通知发送端
窗口大小字段越大, 说明网络的吞吐量越高
接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端
发送端接受到这个窗口之后, 就会减慢自己的发送速度
如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数 据段, 使接收端把窗口大小告诉发送端
拥塞控制
,控制的目的就是避免发送方的数据填满整个网络
,为了在发送方调节要发送数据的量,引入一个拥塞窗口的概念cwnd
是发送方维护的一个状态变量,他会根据网络的拥塞程度动态变化,发送窗口 swnd
,接收窗口rwnd
,这三者的关系为swnd = min(cwnd, rwnd)
,也就是发送窗口是拥塞窗口和接收窗口中的最小值TCP模块刚开始发送数据并不知道网络中的实际情况,所以用一种试探的方式平滑增加 cwnd的大小,慢启动如果不加以控制的话,会使得 cwnd快速增长,导致网络拥塞
在TCP控制中定义了一个状态量:慢启动阈值(ssthresh),当 cwnd < ssthresh 时,使用慢启动算法,如果 cwnd > ssthresh ,使用拥塞避免算法
ssthresh的大小为65535字节
,每当收到一个ACK时, cwnd增加 1/cwnd
参考:《计算机网络-谢希仁版》 &《图解网络》
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141669.html原文链接:https://javaforall.cn