[TCP IP详解:学习笔记]数据传输
TCP的交互数据流
服务器端回显客户端输入的字符过程如图1所示,在回显过程中产生4个报文段:
- 来自客户的交互按键;
- 来自服务器的按键确认;
- 来自服务器的按键回显;
- 来自客户的按键回显确认。
图1 一种可能的处理远程交互按键回显的方法
时延确认:通常TCP在接收到数据时并不立即发送ACK;相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带ACK)。绝大多数采用的时延是200 ms。
Nagle算法:该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP收集这些少量数据的分组,并在确认到来时以一个分组的方式发出去。
在交互数据流中,Nagle算法将产生时延,因此常常关闭Nagle算法。Socket API用户可以使用TCP_NODELAY选项来关闭Nagle算法。
TCP的成块数据流
用三个术语来描述窗口左右边沿的运动:
- 窗口合拢:窗口左边沿向右边沿靠近。这种现象发送在数据被发送和确认时。
- 窗口张开:窗口右边沿向右移动时,将允许发送更多的数据。这种现象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时。
- 窗口收缩:窗口右边沿向左移动时。
如果左边沿到达右边沿,则称其为一个零窗口,此时发送方不能够发送任何数据。
图2显示在数据传输过程中滑动窗口协议的动态性。
图2 滑动窗口协议
从图中可以看出:
- 发送方不必发送一个全窗口大小的数据;
- 来自接收方的一个报文段确认数据并把数据向右边滑动。这是因为窗口的大小是相对于确认序号的;
- 正如从报文段7到报文段8中变化的那样,窗口的大小是可以减小的,但是窗口的右边沿却不能向左移动;
- 接收方在发送一个ACK前不必等待窗口被填满。
TCP支持“慢启动”算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值最为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。