计算机网络--运输层(3) TCP

                                                TCP

1. TCP连接

1.1特点。

TCP是面向连接的。这是因为进程在相互发送数据之前需要先进行连接。连接的双方都将初始化。许多和TCP状态的变量。该连接保存在两个端系统中。而不在中间的网络元素中运行。也就意味着路由器和链路层不会维持该连接。他们甚至不知道有该连接的存在。因为他们看到的只是数据报。

双向连接。当ab两点建立连接后,数据可以从a进程到b进程,也可以从b 到a进程。

点对点。在单个发送方与单个接收方之间连接。相比于“多播”,也就是一个发送方,向多个接收方发送数据。

  --------------------------------------------------------------------------------------------------------------------

1.2.三次握手。

连接的过程为:客户及发送一个特殊的TCP报文段,服务器用另一个特殊的TCP报文段来响应。最后客户及再用第三个特殊的报文段作为响应。在前两个特殊报文段中不承载任何有效信息。既不包括任何应用层数据,但是从第三个报文段开始可以进行数据的传输。因此被称为三次握手。

具体的三次握手的内容, 会在第五部分详细介绍。

连接建立起来后,建成之间就可以传送数据了。客户机的进程通过套接字(门户)传递数据。一旦通过该套接字,数据就由tcp控制。数据会被存储到TCP发送缓存中TCP只是在方便的时候发送缓存中的数据。但是却并没有明确的表达何时。TCP将应用层的数据加上TCP首部,形成TCP报文段,发送给网络层。由网络层的ip封装后发送给另一个主机。当服务器接收到报文段时,会被存放到tcp接收缓存中。应用进程就会从该缓存中读取相应的数据。

图解:

                           

TCP可以从缓存中取出数据量受限于,最大报文段长MMS。该数据一般由,最大链路层帧长度来设定,最大传输单元MTUMTU指的是报文段中应用层数据的最大长度。而不是TCP首部的TCP报文段的最大长度。

  --------------------------------------------------------------------------------------------------------------------

2.TCP报文段结构

2.1  组成

由TCP首部字段+应用层数据组成(该大小又MMS控制)

因此一般传输的数据过长时,会被分割成多个长度小于MMS的片段。

 

2.2  具体结构如下:

                                   

解释:

32比特的序号字段和32比特的确认号字段,用于完成可靠数据传输服务。

16比特接收窗口。用于流量控制。用于指示接收方愿意接收的字节数量。

4 bit 首部长度字段。

6 bit 标识字段。

     ACK用于只是确定字段中值是否有效。也就是之前提到过的。接收方提供给发送方的反馈信息。

    RST、SYN、FIN bit 建立连接和关闭连接。

    PSH bit 被设置时表明数据立即,交付给上层。年要分开。

   URG bit 表示。鲍文段里存在着被发送方的上层实体设置为紧急的数据。

16 bit 紧急数据指针字段。

 

2.3 序号和确认号

2.3.1 报文段序号

由于传输文件过大,而被分割成许多小的报文段时,每个报文段会被赋值一个数字。称之为序号。

比如下面的例子,MMS大小为1000。因此第一个报文段的序号为0。第二个序号为1000。后面以此类推。

                 

NB:事实上,初始序号是可以随机进行选择的。不一定非要从0开始。这样做的优点是,它减少了与就连接使用相同端口号的可能。简单来说,就是为了避免重复。

 

2.3.2 确定号字段

由于连接建立完成之后,数据的传输是双向的。主机A要发给主机b的报文段中,确定号表示的是主机a期望从主机b收到的下一字节的序号

比如,主机A已经收到了0-535的所有字节。那么他期望的就是536及以后的字节,因此,他在这个位置填的数字就是536。

由于TCP协议是累积确认。当主机a接收到0-535字节,和900到1000字节,那么它的确定后字段仍然为536。因为TCP止确认数据流中至第一个丢失字节为止的字节。

 

NB:对于TCP协议来说,并没有明确的规定接收方接收到失序的数据片段时要如何处理?可以进行丢弃,也可以进行缓存。这完全由使用该协议的程序员来决定。只是大多数情况下我们使用后者。

  --------------------------------------------------------------------------------------------------------------------

2.4 Telnet

2.4.1 介绍

它是一个用于远程登录的应用层协议。运行在TCP之上。三协议的缺陷是发送的数据是未加密的。容易被窃听。因此目前使用ssh协议进行远程登录的更多

 

2.4.2 工作过程

当客户机和远程主机建立连接之后,客户机端输入的每个字符都会被发送至远程主机。远程主机在收到后会复制一个相同的字符,发回客户,并显示在Telnet用户的屏幕上。

优点:这种 “回显” 确保用户发送的字符已经被远程主机所处理。

具体实例:

假定A起始序号为42,等待的字节是79;    主机B起始序号为79, 等待的字节是43;

一共进行了三次数据的传输。

第一次的时候,主机a,将字符 C 传给主机b。传输的字节是42。等待的字节是79。

第二次的时候,信息由主机b被传给主机a。ACK = 43,表明已经收到了前42个字节,并且等待第43个字节。并且因为之前提到过的回显。因此把字符 C再一次传回给了主机a。

第三次的时候,主机A传给主机B。ACK = 80,有没有前79个字节已经成功接收到。即使这次没有data,但是seq仍然变成了43。这主要是由于TCP存在序号字段,就意味着报文段中必须存储序序号信息,即使应用层数据为空。

                        

  --------------------------------------------------------------------------------------------------------------------

3.往返时延的估计与超时。

TCP协议通过,超时重传机制来处理数据丢失的问题。但是定时器的时间设置多久合适呢?

该时间间隔必须大于TCP连接的往返时延(RTT),也就是一个报文段发出到收到其确认时的时间长度。

3.1 估计往返时延。

报文段的样本RTT就是从某报文段被发出。到该报文段的确认被收到之间的时间量。

由于路由器拥塞的影响,该时间值会随时波动,因此最好的方式是采取SampleRTT在平均值

计算公式为: EstimatedRTT = (1-a)* EstimatedRTT  + a * SampleRTT     (a = 1/8)

测量RTT变化的公式: DevRTT = (1-b)DevRTT  + b * | SampleRTT - EstimatedRTT |

3.2 设置和管理重传超时间隔。

那么超时的时间间隔到底应该设定为多少呢?

首先一定要比EstimatedRTT 大,具体大多少呢,一般为DevRTT 的4倍

TimeoutInterval = EstimatedRTT + 4 * DevRTT

  --------------------------------------------------------------------------------------------------------------------

4. 可靠数据传输。

TCP实现可靠数据传输时,也依靠很多基本的可靠数据传输的服务。

一般情况下,我们需要对已发送但未被确认的报文段都设定一个相关的定时器。但在该协议中我们只使用单一的重传定时器。 

4.1关于加倍超时间隔。

如果定时器设定的时间间隔,发生超时现象。那么该时间间隔就会被修改。并且它的数值变为原来设定时间的二倍。也就意味着,当第一次我们设定,超时间隔为0.75秒时,发生重传现象后,该时间间隔就会被修改为1.5秒。

4.2 快速重传。

超时触发重传,存在超时周期过长的现象。当一个报文段丢失时,这种超时周期迫使发送方等待很长时间才可重传分组,因此增加了时延。因此在这里我们引入冗余ACK.

冗余ACK:发送方已经收到该报文的确认信息。再次确认。这个报文段的ACK的现象。

对于一个TCP协议的程序来说,一旦收到三个冗余ACK,TCP就执行快速重传。也就意味着不需要等待超时现象发生在重传。而是直接重传。

图解:

                                        

解释:当主机B成功接到前8bit后,发现第二组的20bit丢失,就会再下一次,也就是成功接收第三组的15 bit的数据后,再次返回ACK 100 (想要接受第100bit的数据,但是没有收到的意思)。再收到第四组的6bit后,因为期望的第100字节还是没有得到,所以还会重复请求ACK 100 。因此就会出现ACK 100冗余的现象,那么当主机A收到3个冗余的ACK后,会重传seq = 100的数据

NB:TCP的可靠数据传输,与我们之前学过的,SR和GBN都不同。

  --------------------------------------------------------------------------------------------------------------------

5.流量控制。

5.1背景。

当发送方的数据发送过多过快时,而接收方提取缓存中数据过慢。可能会造成接收缓存溢出。因此需要一种新的服务叫流量控制服务。

5.2 作用。

已清除发送方使接收方缓存溢出的可能性。可以说流量控制是一个速度匹配服务。发送方的发送速率与接收方应用程序的读取速率相匹配。

5.3 实现方式。

发送方维护一个称为接收窗口(RcvWindow)的变量来提供流量控制。该窗口用于告诉发送方,接收方还有多少可用的缓存空间。

RcvBuffer:缓存空间大小

LastByteRead:主机B上的应用进程,从缓存中读取数据的最后一个字节的编号。

LastByteRcvd:从网络中到达的,并且已经放入主机b接收缓存中的数据流的最后一个字节的编号。

如果不希望有缓存溢出的现象,则必须满足下列的表达式:

LastByteRcvd -  LastByteRead <= RcvBuffer

RcvWindow = RcvBuffer - [ LastByteRcvd -  LastByteRead ]

主机B会把RcvWindow 放入报文段中发送给主机A。开始的时候,RcvWindow  = RcvBuffer;

对于主机A来说,需要LastByteRead 和 LastByteRcvd的参数。其实LastByteRcvd -  LastByteRead 也就是主机A发送给主机B,但是还没有被确认的数据量。

NB; 当RcvWindow  = 0 的时候,主机a继续发送只有一个字节数据的报文段。报文段会被接收方确认最终缓存开始清空。并且确定报文段里将包含一个非零的RcvWindow  值。

NB:相比于TCP,UDP是不包含该服务的。

  --------------------------------------------------------------------------------------------------------------------

6.TCP连接管理。

介绍三次握手建立连接。

 

具体过程:

1.客户机会发送一个特殊的报文段给服务器。该报文段内部包含应用层数据。一般被称为SYN报文段。同时客户机会选择一个起始序号(client_isn)

2.服务器成功接收报文段后,服务器会取出其中的TCP SYN报文段。同时为该TCP连接分配缓存和变量。并向客户机发送允许连接报文段。该报文段包括三个信息。SYN = 1;seq = 服务器选择server_isn; ack = client_isn + 1; 该报文段被称之为SYNACK报文段。

3. 客户及收到SYNACK报文段后。客户机也需要分配连接所需的缓存和变量。客户机还会向服务器发送另外一个报文段。用于告诉服务器。你们许我连接的这条信息我已经收到了。这时,SYN = 0;会被传送给服务器。

 

关闭连接时

客户机会向服务器发送一个FIN,服务器发送回馈一个ACK。服务器再发送一个FIN,表明已经关闭该连接。客户机会再次发送一个ack作为确认。

  --------------------------------------------------------------------------------------------------------------------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值