TCP
TCP
提供一条全双工的可靠逻辑信道,在传输数据之前必须先建立连接,数据传送结束后要释放接连,TCP不提供广播或多多播。发送多少报文时TCP决定的(而不是应用进程),对方窗口值以及网络的拥塞程度。
特点
- TCP是面向连接的运输层协议
- 每一条TCP连接只能有两个端点
- TCP提供可靠交付的服务
- TCP提供全双工通信
- 面向字节流
TCP的连接
TCP连接的端点叫做套接字或者插口。每一条TCP连接唯一地被通信两端地两个端点(即两个套接字)所确定。
TCP连接 ::={socket1,socket}={(IP1:port1),(IP2:port2)}
可靠传输的工作原理
停止等待协议(信道利用率低)
停止等待就是每发送完一个分组就停止发送,等待对方的确认,在收到确认后再发送下一个分组。
- 无差错情况
- 发送完一个分组就停止发送,等待对方的确认,在收到确认后再发送下一个分组。
出现差错
超时重传:当接收端收到一个分组检测出了错误,就丢弃该分组,其它什么也不做(不通知发送方);或者数据报在传输过程中丢失了,这时接收方什么也不知道。发送方只要超过了一段时间任然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组,这就是超时重传。要实现超时重传需要设置一个超时时数器
需要注意:
- 发送端在发送一个分组后,必须暂时保存已发送的分组副本,只有得到确认才能清除。
- 分组和确认分组都必须进行编号
- 超市计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些
确认丢失和确认迟到
确认丢失:接收方收到正确分组,恢复确认报文M1,但在发送方设定的超时重传时间内没有收到确认,此时发送方不知道自己发送的分组出错、丢失或者是接收方发送的确认丢失了。因此发送方在超时计时器到期后就要重传报文。接收方收到了以接收过的报文,采取两个动作:
- 丢弃这个重复的分组
- 向发送方发送确认(不能认为已经发送过确认就不再发送,因为发送方之所以重传就表示发送方没有收到对分组的确认)
确认迟到:传输过程中没有出现差错,但接收方对分组的确认迟到了。A会收到重复的确认。处理方法:
- 发送方收下迟到的信息后就丢弃,什么也不做
信道利用率
为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。流水线传输就是发送方可连续发送多个分组,不必没发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地在传送。(需要使用连续ARQ协议和滑动窗口协议)
字节为单位的滑动窗口
TCP的滑动窗口是以字节为单位的。A的发送窗口一般一定不能超过B的接收窗口数值。
流量控制:就是让发送方的发送速度不要太快,要让接收方来得及接收。ACK表示首部中的确认位,ack表示确认字段的值。
拥塞控制
就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
方法:慢开始、拥塞避免、快重传、快恢复
- 满开始:指数增长到门限停止
- 拥塞避免:每经过一个RTT就把发送方的拥塞窗口cwnd加1,直到超时或者收到3个ACK
- 快重传:在收到三个连续ACK后开始快重传,快重传可使整个网络的的吞吐量提高20%
- 快恢复:收到连续的三个ACK开始快恢复算法,门限为3个ACK式窗口的一半,继续开始拥塞避免初始值与门限值相同。
发送方的窗口上限值=Min[ rwnd,cwnd ] rwnd:接收方窗口 cwnd:拥塞窗口
三次握手:
发送消息时ACK必须等于1
ack=上一次seq的值加一
SYN等于1(不能携带数据但是消耗序列号)
SYN=1 | ACK=0 | 表示请求建立连接 |
SYN=1 | ACK=1 | 表示同意建立连接 |
为什么还要最后一次握手:
防止前面的一个在网络上滞留的连接请求(已失效的连接请求报文段)到了服务器,服务器以为是正常的连接请求处理,如果没有最后客户端的确认,服务器会浪费资源。
四次挥手:
FIN为1时表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。服务器向客户端发送释放连接时ack值与上次ack值相同。
三个计时器:
- 超时计时器:发送方发送的消息可能会丢失或者在网络上滞留所以发送方在超过超时计时器是重新发送消息。
- 持续计时器:在流量控制时当对方接收窗口为零时,启动持续计时器,超过这个时间发送探测报文段,检测对方窗口是否还为0。
- 保活计时器:防止客户端突然故障,若服务器在保活计时器时间内(2小时)没有收到客户端的信息会进行探测,在探测后客户端无信息回应,服务器就关闭连接。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2924854739@qq.com
文章标题:TCP
本文作者:DROBP
发布时间:2019-09-11, 23:15:54
最后更新:2019-09-11, 23:17:01
原始链接:https://DROBP.github.io/2019/09/11/TCP/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。