计算机网络-自顶向下方法和Internet特色笔记之三(中)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/peijian1998/article/details/25378647

 

3.5 面向连接到传输TCP

      TCP在一个应用进程向另一个应用进程发送数据之前,两个进程之间必须进行三次握手。

      由于TCP协议仅仅在终端系统中而不在网络的中间元件(路由器和网桥)中运行,所以网络

中元件不需要保留TCP连接的状态。

      TCP连接提供全双工数据传输。如果一个主机上的进程A和另外一个主机上的进程B之间

存在一个TCP连接 ,那么应用程序级的数据可以在A和B之间同时双向传输。

      TCP连接是点到点的连接,它存在于单个发送方和单个接收方之间。不支持多点传送,即:

在一个发送操作中,执行一个发送到多个接收方的数据传送--在TCP中是不可能实现的。

      假设运行在一台主机上的一个进程想要建立和另一台主机上运行进程之间的连接,那么,

发起连接的进程称之为客户进程,而相应连接的进程称之为服务器进程。

      客户端首先发送一个专用的TCP数据段,服务器以第二个数据段作为应答,最后客户端再次

以第三个数据段作为应答。前两个数据段不包含任何有效载荷--没有应用层的数据,第三个数据

段可以传送有效载荷。由于两个主机之间传送的这三个数据段,这个连接的建立过程通常被称为

三次握手。

      客户进程将一连串数据送人套接字中,TCP将这些数据存入连接的发送缓冲区,TCP在方便的

时候欧诺个数据段的方式发送数据。最大数据段尺寸MSS对每次摄取并放入数据段红的最大数据量

进行了限制。MSS依赖TCP的实现(由操作系统觉定)并且经常可以配置,MSS通常值为1500字节,

536字节,512字节,这些大小都是为了避免IP对数据进行分割而选择的。MSS是数据段中应用程序

级数据的最大量,而不是TCP的包括头部的数据段最大尺寸。

      TCP用一个TCP头部将每一块应用进程数据进行封装,这样就得到了TCP数据段。这些数据段

被传送到下面的网络层,在哪里它们被分别封装到网络层IP数据报中。

      当TCP在另一端接收到一个数据报,该数据报中的数据就被入TCP连接的接收缓冲区。应用

进程从这个缓冲区中读出数据。

      TCP连接的每一方都有自己的发送缓冲区和接收缓冲区。

      通常,选项字段是空的,所以典型的TCP头部的长度为20字节。

      TCP将数据看作是无结构但是有顺序的字节流。TCP对顺序号的使用反映了这一点,这是因为顺序号的

设定是以传送的字节流而不是数据段为单位。

      一个数据段的顺序号是数据段的第一个字节在字节流中的编号。

      假设主机A上的进程要给主机B上的进程发送数据。假设数据流的组成是这样的:一个由500000字节组成

的文件、1000字节的MSS,并且数据流的第一个字节的编号为0。则,TCP为该字节流构造了500个数据段。

第一个数据段的顺序号为0,第二个数据段的顺序号为1000,第三个数据段的顺序号为2000,等等。每一个

顺序号都被插入到相应的TCP数据报头部中的顺序号字段中。

      由于TCP是全双工的,所有主机A向主机B发送数据的同时,它也可以从主机板接收数据(在同一个TCP连接中)。

      每一个从数据B到达的数据段都包含着从B到A发送数据的顺序号。主机A放入数据段中的确认号,是希望

从B获得的下一个数据段的顺序号。

      假设主机A已经从B那里接受到了编号为0-535的字节,并且假设A现在要向B发送一个数据段。换句话说,

主机A正在等待主机B数据流中的第536个和其后的字节。所有主机A将536放入它即将发送给主机B的数据段

中的确认号字段中。

      另外一个例子,假设主机A已经从主机B那里接收到了两个数据段:其中一个包含0--535字节,另一个包含

900--1000字节。由于某种原因,主机A还没有收到从536--899的字节。在这个例子中,主机A为了重新建立数

据B 的字节流,仍然等待着数据B第536个和其以后的字节。这样,A的下一个要发送到B的数据段中的确认号字

段就为536.因为TCP仅仅对第一个丢失的字节给出确认,所以我们认为它所提供的为累积确认。

      IP服务是不可靠的。IP不能保证数据报的正确传输,不能保证数据报的按顺序传输,也不能保证数据报中

数据的完整性。在IP服务中,数据报可能会在路由器的缓冲区中浮生溢出而到达不了终点,数据报可能乱序

到达,而且其中的某些比特可能被损坏--由1变0或由0变1。由于传输层的数据段是由IP数据报携带着在网络层

中传输的,所以这些数据段也同样面临着这些问题。

      TCP在IP的不可靠尽力而为的服务中创建了可靠数据传输服务。TCP的可靠数据传输服务保证了进程从它的

TCP接收缓冲区中读出的数据流是为受损害的、无间断的、无重复的,并且是有序的。也就是说,接收到的字节

流与所发送的字节流是完全相同的。

TCP发送方必须处理的三个事件:

      1、TCP发送方必须处理的第一个事件是:

      应用层数据传送到TCP,在这里它们被封装到数据段中,然后传送给IP。

      2、TCP发送方必须处理的第二个事件是:

      TCP每次向IP传送一个数据段的时候,都会为该数据段启动一个计时器。如果该计时器到期了,发送方

就会产生一个中断事件。TCP对该中断事件作出响应。

      3、TCP发送方必须处理的第三个事件是:

      TCP必须处理从接收方传来的确认数据段(ACK)。在这里,发送方TCP必须确认该ACK是发送方TCP现在

等待的数据段的首次ACK,还是对以前已经收到过确认的数据段的重复确认。

      当首次ACK到达时,发送方就可以知道被确认的字节以前的数据都已经被接收方正确接收了。这样,

送方就可以更新它的TCP状态变量了,这些状态变量是用来追踪接收方已经正确接收的最后一个字节的

顺序号。

      当TCP接收方收到了一个数据段,而且该数据段的顺序号比下一个应当收到的、正期待的、有序到达的

数据的顺序号大时,它就会检测到数据流中出现了缺失--也就是说,一个缺失的数据段。因为TCP不给出

否定确认,所以接收方无法给发送方一个明确的否定确认。然而,它会简单的对所接收到的最后一个有序字

节给出重复确认,即它产生一个该数据段的重复ACK。如果TCP发送方收到了同一个数据段的3个重复确认,

就表示被确认了3次的数据段后面的数据段已经丢失了。在这种情况下,TCP执行快速重复,在该丢失的数据段

的计时器超时之前重新发送该数据段。

3.5.6流量控制

      TCP连接在爽个主机上都各自为连接留出了接收缓冲区。当TCP连接接收到了正确的、有序到达的字节时,

它就将数据放入接收缓冲区。相关的应用程序将从该缓冲区读出数据,但不一定在数据到达的那个时刻。

      TCP为它的应用程序提供了一个流量控制服务,以此来限制发送方造成接收方缓冲区溢出的可能性。当然,

TCP的发送方也可能由于IP网络中的拥塞而被遏制,这种发送方的控制形式称为拥塞遏制。

      尽管拥塞遏制和流量控制对发送方的限制非常相似,但是它们却是针对不同的原因所采取的。

      TCP通过让发送方保留一个称为接收窗口(receive window)的变量来提供流量控制。

      通俗来说,接收窗口用来告诉发送方接收方缓冲区还有多少可用的空间。

      在一个全双工连接中,连接双方的发送方各自保留了一个接收窗口。接收窗口是动态的,它在连接的整个生命

周期中是不断变化的。

      主机B把当前的RcvWindow值(接收缓冲区剩余的空间)放入它发送给主机A的数据段的窗口字段内,来通知主机A

它在该连接的缓冲区中还有多少可用空间。

      TCP规则规定,当B的接收窗口为0的时候,主机A仍然继续向B发送只有一个字节的数据。这些数据会被接收方

确认。最后,最后,当B接收缓冲区有可用空间后确认里面会包含一个非0的RcvWindow值。

      UDP 不提供流量控制,所以如果接收方进程从缓冲区中读出数据不够快的话,缓冲区将会发生溢出。

3.5.3往返计时和超时

      当主机向TCP连接发送一个数据时,它就启动了一个计时器。如果主机接收到数据的确认之前,计时器发生

超时,那么主机将重新发送这个数据段。从计时器开始计时到计时终止之间的时间间隔称为计时器的超时时间。

显然,超时时间应该比连接的往返时间要长。但是超时事件又不能比往返时间大很多,否则当一个数据段丢失了,

TCP就可能不会很快重发该数据段。

往返时间RTT

     往返时间RTT就是从发送该数据(即传送到IP层)到该数据段的确认ACK被接收之间的时间。

3.5.8 TCP连接管理

      TCP连接的建立会显著的增加延迟。

      让我们看看如何创建一个连接:

      1、第一步 客户端TCP首先给服务器端TCP发送一个特殊的TCP数据段。该特殊的数据段不包含应用层

数据。它需要将该数据段的头部中的一个标志字段SYN置1。另外,客户会选择一个初始顺序号client_isn。该

数据段被封装到一个IP数据报中,发送给服务器。

      2、一旦装有TCP SYN数据段的IP数据报到达服务器主机,服务器将从该IP数据报中提取TCP SYN数据段,

给该连接分配TCP缓冲区和变量,并给客户端TCP发送一个允许连接的数据段。这个允许连接的数据段也不包含

任何应用层数据。但是,它的头部中装载着三个重要信息:首先,该数据报SYN置1;其次,TCP数据段头部的

确认字段ACK被置为client_isn+1;最后,服务器TCP选择它自己的初始顺序号server_isn,并将该值放到TCP数

据段头部的顺序号字段中。

      3、第三步 在接收到允许连接数据段之后,客户也会给连接分配缓冲区和变量。客户端主机还会给

服务器主机发送一个数据段对服务器的允许连接数据段给出确认:客户端TCP通过将值server_isn+1放入

TCP数据段头部的确认字段来完成这项工作。因为连接建立了,所以SYN被置为0。

      当以上三步都完成了以后,客户和服务器主句就可以互相发送装载有应用层数据的数据段了。在以后的

每一个数据段中,SYN都会被设置为0。

 

      参与TCP连接的两个进程中的任何一个都可以终止连接。当连接结束之后,主机上的资源(缓冲区和变量等)

将会被释放。

      假设客户端想要终止该连接,客户会发送一个结束命令。这个特殊的数据段的头部中的FIN标志位被置1。

当服务器接收到这个数据段,它就会回送给客户一个确认数据段。然后服务器发生它自己的终止数据段,其中

FIN被置1。最后,客户对服务器终止数据段给出确认。这时,两个主机上的所有资源被释放。

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

展开阅读全文

没有更多推荐了,返回首页