Tcp Bulk Data

TCP在数据传输中有receive buffersend buffer。通过连接中的window size可以看出数据的读取情况。

sliding window

client不需要等待已发送的packetACK,可以发送多个准备好的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不想让该packettcp buffer中被缓存,去等待额外的数据到来,而是应立即传递给receiver处理。

slow start

senderreceiver网络连接中可能存在很多hop或者slower links,这也就导致了window size确定的复杂性。这便引入了congestion window,术语slow startsender在建立连接后,先初始化window为一个segment,每次收到acksender便增加一个segmentexponential increae),最终,segment的大小便是congestion window size

Delayed Acks

sliding window有效的提升了TCP的数据传输效率,使得接收数据的一端可以在收到多个packet后统一回复最后一个packetACK消息。发送数据的一端完全不需要等待数据被ACK之后,再才开始发送下一个packet