剖析TCP系列(一)

面向连接的运输:TCP

基础介绍:

      TCP是因特网运输层的面向连接的可靠的运输协议,为什么说是面向连接(connection-oriented)的呢?因为在一个应用进程可以开始向另一个应用进程发送数据之前,这俩进程必须先互相“握手🤝”,即他们必须互相发送某些预备报文段,以建立确保数据传输的参数。

      TCP连接提供的是全双工(full-duplex service):如果一台主机上的进程A与另外一台主机上的进程B存在一条TCP连接,那么应用层数据就可在从进程B流向进程A的同时,也从进程A流向进程B。TCP连接也总是点对点(point-to-point)的,即在单个发送方与接收方之间的连接。

  我们现在来康康TCP连接是如何建立的。假设运行在某台主机上的一个进程想与另外一台主机上的进程建立一条连接,发送连接的进程被成为用户进程,而另一个进程被称为服务器进程,该客户应用进程首先要通知客户运输层,它想与服务器上的一个进程建立一条连接。暂时简单来说TCP建立的过程:客户首先发送一个特殊的TCP报文段,服务器用另一个特殊的TCP报文段来响应,最后,客户再用第三个特殊报文段作为响应。前两个报文段不承载“有效载荷”,也就是不包含应用层数据,而第三个报文段可以承载有效载荷。由于两台主机之间发送了三个报文段。所以这种连接被称为三次握手🤝。

 

  TCP连接的组成包括:一台主机上的缓存、变量和与进程连接的套接字,以及另外一台主机上的另一组缓存、变量和与进程连接的套接字。这两台主机之间的网络元素(路由器、交换机和中继器)中,没有为该连接分配任何缓存和变量。

序号和序列号

  在看TCP连接之前,先介绍一下序号和确认号。

  TCP报文段的首部中两个最重要的字段是序号字段和确认号字段。这两个字段是TCP可靠传输服务的关键部分。在讨论这两个字段是如何用于提供可靠的数据传输之前,先来解释下TCP在这两个字段中究竟放置了什么。

  TCP把数据看成是一个无结构的、有序的字节流。我们可以从TCP对序号的使用上看出这一点,因为序号是建立在传送的字节流之上(我的理解是每个字节都有其对应的序号),而不是建立在传送的报文段的序列上,也就是说,序号代表的是传送数据的第几个字节,而不是第几个报文段。一个报文段的序号(sequence number for a segment) 因此是该报文段首字节的字节流编号。传输文件前,文件数据会被划分成TCP报文段,下图中我们假设初始序号是0,但其实TCP连接双方均可随机选择初始序号,这样做可以减少那些仍在网络中存在的来自两台主机之间先前已经终止的连接的报文段被误认为是后来这两台主机之间新建连接所产生的有效报文段的可能性。举例如下图:

  现在考虑一下确认号。确认号要比序号难处理一些。由于TCP是全双工的,因此主机A在向主机B发送数据的同时,也许也接收来自主机B的数据(都是同一条TCP连接的一部分)。从主机B到达的每个报文段中都有一个序号用于从B流向A的数据。主机A填充进报文段的确认号是主机A期望从主机B收到的下一字节的序号。假如主机A已收到来自主机B的包含字节 0~255 的报文段,以及另一个包含字节 900~1000 的报文段。由于某种原因,主机A还没收到字节 256 ~ 899 的报文段。在这个例子中,主机A为了重新构建主机B的数据流,仍在等待字节256和其后的字节。因此,A到B的下一个报文段将在确认号字段中包含256。因为TCP只确认该流中至第一个丢失字节为止的字节,所以TCP被称为提供累计确认(cumulative acknowledgment)。

  当主机的一条TCP在连接中收到失序报文段(例如等待256字节,但是收到了1256字节开始的报文段)时怎么办,有趣的是,TCP RFC(Request for Comments 意见请求),并没有为此明确规定任何规则,而是将这一问题留给TCP的编程人员处理。他们有两个基本选择:1. 接收方立即丢弃失序报文段(这样可以简化接收方的设计); 2. 接收方保留失序的字节,并等待缺少的字节以填补该间隔。显然后者对网络带宽更有效,也是实践中采用的方法。

 

  下面来看一个经TCP的简单Telnet应用的确认号:

假设客户和服务器的起始序号分别是42和79。上文已述,一个报文段的序号就是该报文段数据字段首字节的序号。因此客户发送的第一个报文段的序号是42,服务器发送的第一个报文段的序号是79。第二个报文段是由服务器发往客户。它有两个目的:首先它是为该服务器所收到数据提供一个确认,通过在确认号中填入43,服务器告诉客户它已经成功收到42以及以前的所有字节,现在等待着43的出现。第二个目的是回显字符'C'的ASCII码。第三个报文段是从客户发往服务器端,唯一目的是确认已从服务器收到的数据。该报文段的数据为空。

 

参考书籍:

《计算机网络 自顶向下方法(中文第6版》

https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE

posted @ 2020-08-27 03:23  mengtaozhang  阅读(258)  评论(0)    收藏  举报