TCP (Transmission Control Protocol)
重要特点:
- 面向连接
- 面向字节流
- 每一条连接只能有两个端点,只能是一对一的
- 提供可靠交付的服务
- 提供全双工通信
面向报文和面向字节流的区别:https://blog.csdn.net/ce123_zhouwei/article/details/8976006
TCP根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP发送的报文长度是应用进程给出的)。
TCP具有发送缓冲区和接收缓冲区,它可把太长的数据划分短一些再传送,也可以等待缓冲区积累有足够多的字节后再构成报文段发送出去。
TCP连接的端点不是主机,不是IP,不是应用进程,也不是运输层的协议端口。TCP连接的端点叫做Socket或插口。端口号拼接到IP地址即构成了Socket。
套接字 Socket = (IP地址:端口号)
每一条TCP连接唯一地被通信两端的两个Socket所确定。
可靠传输的工作原理
理想的传输条件:
- 传输信道不产生差错
- 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据
实际网络中,我们可以使用一些可靠传输协议,当出现差错时让发送方重传,同时在接收方来不及处理收到的数据时,及时告诉发送方适当降低发送数据的速度。这样,本来不可靠的信道就能够实现可靠传输了。
停止等待协议
“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
超时重传
在发送方A超过一段时间仍然没有收到确认,就认为刚发送的分组丢失了,因而重传前面发送过的分组。这就叫做超时重传。
确认丢失
接收方丢弃重复的报文,并重传相应的确认报文。
确认迟到
收下迟到的确认但什么也不做。
像上述的这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat Request)。意思是重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。
停止等待协议的优点是简单,但缺点是信道利用率太低了。使用流水线传输可以大大提高信道利用率。流水线传输需要连续ARQ协议和滑动窗口协议的支持。
连续ARQ协议
连续重发请求ARQ方案是指发送方可以连续发送一系列信息帧,即不用等前一帧被确认便可继续发送下一帧,效率大大提高。但在这种重发请求方案中,需要在发送方设置一个较大的缓冲存储空间(称作重发表),用以存放若干待确认的以及待发送信息帧。当发送方收到对某信息帧的确认帧后,便可从重发表中将该信息帧删除。所以,连续重发请求ARQ方案的链路传输效率大大提高,但相应地需要更大的缓冲存储空间。
连续ARQ协议规定,发送方维持一个发送窗口,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。接收方一般都是采用累积确认的方式。就是说,接收方不必对收到的分组阻隔发送确认,而是在和搜到几个分组后,对按序到达的最后一个分组发送确认。这样做的优点是实现容易,节省带宽;缺点是容易发生Go-back-N问题。
TCP可靠通信的具体实现
- TCP连接的每一端都必须设有两个窗口——一个发送窗口和一个接收窗口。
- TCP的可靠传输机制用字节的序号进行控制。TCP所有的确认都是基于字节序号而不是基于报文段
- TCP两端的四个窗口经常处于动态变化之中
- TCP连接的往返时间RTT也不是固定不变的。需要使用特定的算法估算较为合适的重传时间。
TCP报文段首部格式
下面是一些重要字段的说明:
- 源端口、目的端口:各占两个字节,写入源端口和目的端口
- 序号:TCP连接中传送的字节流中的每一个字节都按顺序编号,该字段写入本报文段所发送的数据的第一个字节的序号
- 确认号:期望收到对方下一个报文段的第一个数据字节的序号。
- 数据偏移ÿ