TCP的机制与实现
version 1.0
2008-11-3
一、 TCP的任务:
在不可靠的IP之上,实现可靠的端到端的字节流服务;
二、 要解决的问题:
l 数据分段,将合适大小的数据段交给IP传送;
l 确认与重发;
l 校验和以保证数据传输的正确性;
l 失序数据的排序,丢弃重复数据;
l 流量控制;
l 拥塞避免;
三、 问题与解决方案
1, 建立连接的需要——处理网络中的延迟、重复分组
问题:如果连接建立、数据发送、连接断开的分组都存储在网络中,并在后面某个时候有规律地到达接收端,则可能:
1) 如果连接还存在,这些数据会被接收方丢弃;
2) 如果连接已经断开,接收端可能会再次执行连接建立、数据处理、断开的过程;
解决思路:
1) 废弃使用过的传输地址;
2) 每个连接分配一个标识符;
3) 保证每个分组在网络中停留时间不超过某个已知值;
解决办法:
2MSL等待?对于服务器来说是一个连接4元组的等待还是监听端口的等待?如果是4元组的等待,OS应该允许socket被重用,但是需记录已经释放的4元组。
根据TCP的标准状态机实现连接建立与关闭。
2, 确认与顺序收发
TCP头中的Seq、ack_seq,对每个发送的字节进行编号,收到小序号的报文段直接丢弃,收到大序号的报文段,发送ack通知对方自己已成功收到的数据,要求对方重发;该报文段应该缓存起来,以处理仅仅是报文段到达接收方顺序不对的情况;
TCP不提供要求对方发送指定报文段的能力;
RFC1106引入NAK扩展,要求对方发送指定的报文段;缓存已获得的大序号的数据(可能是包丢失,或失序),在获得重发报文段时,一次性确认收到的所有数据,并将所有数据提交给应用;
接收方收到重复ACK时不应立即重发数据,见“快速重发与快速恢复”。
实现:
存储待发Segment