Tcp Bulk Data
Posted by 付辉 on Monday, September 24, 2018 共1089字TCP
在数据传输中有receive buffer
和send buffer
。通过连接中的window size
可以看出数据的读取情况。
sliding window
client
不需要等待已发送的packet
的ACK
,可以发送多个准备好的packet
。换句话说,server
端并不需要对每一个收到的packet
,都执行ack
操作。因为有缓冲去的存在,所以可以对收到的多个packet
,统一回复一个ack
。
window size
通过握手,TCP
两端交换window size
的大小。sender
可以连续发送多个packet
来填满receiver's window
,当应用层从buffer
中读取数据之后,window size
便会更新。比如,在ack
的回复中,如果显示win 0
,则表示receiver
接收到了所有数据,但数据还在buffer
中,尚未被应用读取。之后数据被读取,window size
便会被更新,通过ack
来重新通知sender
。需要注意的是,该ack
仅仅只是通知window size
的更新。
对于window size
,相关的是sliding windows
。可以简单的想象成固定长度的“队列”,长度一定,表示window size
是固定的。应用读取数据之后,队列末尾便会追加对应数量的size
,供sender
发送新的数据,队首的数据便彻底被移除了。
还有一点需要注意的:client
端经常有数据需要发送,当收到ACK
之后,client
就会立即发送buffer
中准备好的数据,应用端无法同时读取buffer
中的数据来更新window size
。所以,一般发送数据的client
端的window size
要比约定的小点。
PUSH
PUSH flag
这是TCP header
中的一个标识,用于表示sender
不想让该packet
在tcp buffer
中被缓存,去等待额外的数据到来,而是应立即传递给receiver
处理。
slow start
sender
和receiver
网络连接中可能存在很多hop
或者slower links
,这也就导致了window size
确定的复杂性。这便引入了congestion window
,术语slow start
。sender
在建立连接后,先初始化window
为一个segment
,每次收到ack
,sender
便增加一个segment
(exponential increae
),最终,segment
的大小便是congestion window size
。
Delayed Acks
sliding window
有效的提升了TCP
的数据传输效率,使得接收数据的一端可以在收到多个packet
后统一回复最后一个packet
的ACK
消息。发送数据的一端完全不需要等待数据被ACK
之后,再才开始发送下一个packet
。