1、TCP概述
- 进程到进程的通讯;
- 可靠的,按顺序的字节流,没有报文边界;
- 流水线方式,TCP拥塞控制、流量控制,设置窗口的大小;
- 全双工:在同一连接中数据双向流动;
- 面向连接:在数据交换之前,通过握手(交换控制报文)初始化发送方、接收方的状态;
2、TCP报文段结构
序号:本TCP报文段第一个数据 在应用层报文中的字节序号;
以MSS(最大报文段大小)为单位切分段;
MTU 最大传输单元:以太网最大传输单元是1500字节;
MSS = 1500 - 20(TCP头部)- 20(IP头部)= 1460字节;
确认号:累积确认,确认n-1及以前的字节;
(比如确认号是555,代表554及以前都到了,下回想要555)
首部长度:固定20字节+可选项的长度,就是整个首部;
首部长度是以4字节为单位,4bit;
比如,首部长度最大是1111,即最多15*4=60字节;
校验和:求和,进位回卷,取反码;
紧急数据指针:古老的字段,已经不用了;
关于序号和确认号的例子
A 发给 B:我现在发送编号42的数据,希望下一个收到编号79的数据(78以以前都收到了);
B 发给 A:我现在发送编号79的数据,希望下一个收到编号43的数据(42以以前都收到了);
3、怎样设置TCP的超时时间?
超时时间不能太短,否则会重复发送数据;也不能太长,响应太慢;
RTT是变化的,用最近几次RTT的平均值(权重不同)来估算,即EstimatedRTT;
用EstimatedRTT作为参照来设置,比EstimatedRTT要长,再加上4倍的标准差;
正态分布,实际值 在 (均值 ± 4倍标准差) 范围的概率是99.99%以上;
4、TCP如何实现可靠数据传输?
流水线(管道化)的方式
- 累积确认(像GBN)
- 单个重传定时器(像GBN),超时后只发送最早未确认的段(像SR);
- 接收方是否接受乱序,没有规范;
3次冗余确认后,快速重传
假设编号99的数据已收到,接收方返回ACK100(第一次),接收方一次接受一个数据,即只期待100;
然后,发送方发了100,101,102,103,在路上100丢失了,到达的只有101,102,103;
由于到达的编号大于期待的编号100,所以接收方只得发送之前的ACK100;
当101发的ACK100(冗余第一次)到发送方,可能是101和100乱序;
当102发的ACK100(冗余第二次)到发送方,也可能是102和100乱序,再等等;
当收到103发的ACK100(冗余第三次),基本断定100是丢失了,所以立即重发;
TCP发送方流程
TCP重传机制
最右边的图,即便是ACK100丢失,但是由于TCP是累计确认的,在收到ACK120的时候,就认为119及以前的数据以及收到了,所以发送窗口的后沿base = 120;
产生TCP ACK的建议
接收方事件 | 接收方动作 |
1、期望序号之前的数据已被确认; 2、期望序号的报文段到达; | 延时ACK; 若500ms超时,下一报文段还没到,则发送ACK; |
1、期望序号的报文段到达,等待发ACK过程中; 2、下一个报文段到了; | 立即发送一个累计ACK;(可确认两个报文段收到) |
1、比期望序号大的报文段先到达; 2、检测数据流的间隔; | 立即发送之前的ACK(冗余ACK),指明期待字节序号; |
1、能全部或部分填充数据间隔的报文段到达; | 若该报文段起始于间隔的低端,立刻发送ACK; (这是间隔,所以后面数据已经到了,不用等) |
5、TCP流量控制
接收端有接收的缓冲区,除了已收到但上层应用还未读出的数据,剩余的空间就是还能再接收数据的空间RevWindow;
RevWindow在TCP报文中的 接收窗口 中表明,发送方就不会发送比这个值多的数据,这就是流量控制;
6、TCP连接管理
6.1、2次握手,存在的问题
半连接:
- A向B发出请求建立连接,B同意,但是B同意的ACK比较慢到达,导致A又发送一次申请建立连接;
- 后来AB传输数据,拆除连接;
- 某一时刻,滞留在网络中的那次A的申请连接到达B,B误以为A要建立连接;
老数据被当成新数据:
- 在上面半连接的基础上,还有一个A曾经发送的数据也到达B;
- B不仅单方面建立连接,还接收了数据;
6.2、3次握手
在正式交换数据之前,双方要都知道对方愿意建立连接;
- A:申请建立连接,我从序号X开始发;
- B:已收到X,ACK(X+1);
- B:申请建立连接,我从序号Y开始发;
- A:已收到Y,ACK(Y+1);
中间的两次B可以合并为一次,所以是三次握手;
初始序号要是变化的,防止滞留在网络中的数据对以后通信造成影响;
6.3、TCP关闭连接
双方分别关闭自己这一侧的连接,共4次挥手;
- A:我要关闭连接,FIN;
- B:好的,ACK;
- B:我要关闭连接,FIN;
- B:好的,ACK;