TCP 协议详解(一)-- 概述与可靠传输的实现

前言

TCP(Transmisson Control Protocol)又叫传输控制协议作为传输层最重要的协议,对于信息的可靠传输有着重要的意义,针对这一协议的攻击也数不胜数,这里就对这一协议以及相关内容进行详细的总结,将从以下几个方面进行介绍。
本文以韩立刚老师的《计算机网络》网课为基础,感兴趣的话可以私信我要资料

1. TCP协议概述

在网络中,接收端从发送端接收的数据大部分条件下都必须是完整的,一字不落的,否则数据也就失去了意义,比如在下载应用时,下载过程中丢失了一个动态链接库(DLL)文件,那么这个应用就很可能打不开,只有在很少情况下不需要那么精准,那么使用UDP就行,但是TCP使用范围更广,下面是其几个特点。

  1. TCP 是面向连接的传输层协议。
    利用TCP协议传输数据前,必须使client和server通过tcp的三次握手建立连接并协商双方的各种参数,在传输完成后还需要通过四次挥手释放连接,也就是说在通过tcp协议传输时,双方一直要都处在连接状态

  2. 每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。
    相对于UDP在广播以及多播中的一对多,TCP连接时一对一的。

  3. TCP 提供可靠交付的服务。

  4. TCP 提供全双工通信。
    这里说的全双工大家可以理解为打电话,双方都可以收发消息,这是相对于单工和半双工来说的,UDP就是典型的单工通信(想了解单工、半双工和全双工区别的同学可以看这篇文章

  5. 面向字节流。
    TCP是以字节为单位进行传输的,不是以位为单位
    简单过程如下:
    在这里插入图片描述
    其中“1,2,3…”是代表着一个个字节。
    详细过程如下:
    在这里插入图片描述
    6. TCP的连接
    TCP 把连接作为最基本的抽象,每一条 TCP 连接有两个端点,TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是传输层的协议端口。TCP 连接的端点叫做套接字(socket) ,而套接字是由IP地址加上端口号拼接而成的。
    如下图:
    在这里插入图片描述
    这里有一点要补充,现在已经得到广泛应用的SSL协议(安全套接字协议)和TLS(安全传输层)协议中的记录协议就是应用在传输层,通过加密等手段来保证安全。

2.TCP如何实现可靠传输

网络层只负责把数据包从一个网段转到另一个网段,中间因为网络拥塞或者中断等原因可能导致数据包丢失,那么其中包括的TCP数据报肯定也就随之丢失,那么如何在不稳定的网络中进行TCP数据报的可靠传输(也就是把所有要传的文件完整的从一台电脑传输到另一台电脑呢)?
于是就产生了停止-等待协议(Stop-and-Wait),其原理如下:
(一)先看一下无差错情况:

在这种情况下A向B发送TCP报文,发送一个,确认一个,然后再发送第二个,这是理想情况,如前言所说,因为网络环境的复杂,会存在各种丢包的情况。
下面就来看看在网络中丢包的各种情况,以及保证在每个情况下保证可靠传输的方式
(2)出错情况
大致分为如下三种情况:
(a). 数据包没有到达B,如图:

A在发送一个数据后,会为这个数据设立一个计时,如果在规定的时间内没有收到B的确认收到的答复,那么就会重传这个数据,这种机制叫做超时重传,这样就可以保证每个数据都会传输完成。
(b). 数据包到达了B,B也发送了确认消息,但是在发送给A的过程中丢失,如下图:

在这种情况下,A像第一种情况下没有收到B对于M1的确认信息,于是在超时后重传了M1,这就导致了B接收到了两次M1,那么经过比较以后,B就会把相同的数据,也就是第二次传输来的M1丢弃,然后再次向A发送确认已经收到M1的消息,让A继续发接下来的数据。
(c). 像b中一样,数据包到达了B,B也发送了确认消息,但是在发送给A的过程中因为走了较远的路由路线,所以迟迟到不了A,这种情况如下:

因为第一次确认走了远路,确认信息迟迟到不了A,超过时限以后,A自动重传,像(b)情况一样,因为B计算机已经收到了数据M1,所以会丢弃重复的M1,并再次向A发送确认,如果还是走了远路没有到达,那么就重复这一过程,指导有对于M1的确认信息到达A,A才开始发送M2数据,而对于后面迟到的对于M1数据的确认信息,A不会再做任何响应,因为已经对其响应过了。

上面的这四种情况都解决了以后,也就可以实现可靠传输了,这种传输的方式习惯上被称为自动重传请求ARQ(Automatic Repeat Reauest),值得注意的是,这个名字容易给人一种误解,“请求”这个词是不准确的,B并不需要像A发送重传请求,A在设定的时间超时后会自动重传,没有“请求”的过程。

还有几点需要注意:

  1. 为了对可能的重传做准备,在发送完一个分组后,必须暂时保留已发送的分组的副本。
  2. 为了对比发送和确认的数据是否是同一个,需要在发送端和接收端都对数据进行编号,这样的话,发送端就可以比较受到的确认是对哪一个数据的确认,如果重复的话,就丢弃这个确认,接收端也可以根据编号来比较这个数据是否收到过,从而判断是丢弃还是发送确认。这里发送端和接收端的编号应该相同。
  3. 超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。
    这样才不会重复分发送多次数据。

但是,虽然利用停止等待协议和ARQ协议可以实现数据的可靠传输,这种机制也有一个明显的缺点,那就是太慢了,每发送一个TCP报文,就得等待 一个特定时长或者收到对方的确认信息才能进行下一步操作,这样对于传输信道的利用率就太低了,这里先介绍一下信道利用率的概念,如图:
在这里插入图片描述
这是数据报文在A B之间传输的示意图,其中,TD 代表A计算机发送一个数据报文所需的时间,RTT是Round-trip-time的缩写,意思是往返时间,TA是A计算机接收确认信息所需的时间,那么信道利用率的定义就如图:
在这里插入图片描述
从公式和示意图都可以看出,要想提高信道利用率并提高发送速度,就要使TD的值尽可能大,下面就来介绍如何提高TD的值。
单个TD的值很难改变,那么就通过多发送来提高TD的值,如图:
在这里插入图片描述
这种方式叫做流水线传输,这样就能大大增加在信道中传输数据的数量,提高传输速度。
同样,这里也得保证数据的可靠传输,由此引进了滑动窗口技术,利用的是连续ARQ,如图:
在这里插入图片描述
对于发送方来说,假设滑动窗口的大小是5,那么就意味着一直有5个数据在窗口内,窗口内的数据一个个按队列发送,而不用等确认信息,如图,发送顺序为1-2-3-4-5,不如在发送3的过程中,收到了1的确认,那么窗口就把1从窗口中去除(也就是从缓存中删除),窗口也相应的向前滑动一格,变成了2-3-4-5-6,这样,收到一个确认删除一个,往前滑一格。
但是每次都只能接收一个数据的确认显然速度还是慢,那么就产生了“累计确认”的方式,如图:
在这里插入图片描述
B计算机在收到1 2 3 三个数据报文以后,只返回3的确认信息,就代表着已经收到了3之前的数据,这样也就减少了确认数据包所需时间,从而提高了速度。
但是这种方法也有一个缺点,考虑以下情况,如图:
在这里插入图片描述
B计算机收到了1 2和4,但是因为中间缺少了3,B就只会向A发送1 2 的确认包,就默认4没有收到,然后A就会再重新发送3,超时以后就会重传4(后面会讲到改进方法)。
因此累积确认有以下特点:
优点是:容易实现,信道利用率高。
缺点是:不能向发送方反映出接收方已经正确收到的所有分组的信息。
下一篇会介绍TCP首部详解与抓包分析实践,如有需要,请移步

猜你喜欢

转载自blog.csdn.net/qq_29566629/article/details/106020030