目录
第一章 概述
分层
链路层
网络层(提供点到点的服务)
运输层(提供端到端的服务)
tcp
udp
应用层
客户----服务器模型
重复型服务器:
并发型服务器
为什么只对服务器进行分类,而不对客户端进行分类?
端口号
第二章 链路层
目的
环回接口
关键点:
MTU(最大传输单元)
路径MTU
第三章 ip:网际协议
不可靠
无连接
IP首部
IP路由选择
路由表每一项包含以下信息
IP路由选择主要完成的功能
第四章 ARP:地址解析协议
例子
ARP高速缓存
第十一章 UDP协议
UDP服务器的设计
目的IP地址
UDP输入队列
限制本地IP地址
第12章 广播和多播
指向网络的广播
指向子网的广播
第13章 IGMP:Internet组管理协议
加入一个多播组
IGMP报告和查询
规则:
第14章 DNS:域名解析系统
第15章 TFTP:简单文件传送协议
第16章 BOOTP:引导程序协议
第17章 TCP:传输控制协议
面向连接
可靠性:
tcp可靠性的保证机制总结
1.检验和
2.序列号
3.确认应答机制ACK
4.超时重传机制
5.连接管理机制,三次握手四次挥手
6.流量控制
7.拥塞控制
第18章 TCP连接的建立与终止
查看tcp状态命令
建立连接:
释放连接
TCP的半关闭
TCP的状态变迁图
TCP连接正常建立和终止所对应的状态
2MSL等待状态
平静时间
半打开
TCP服务器设计
TCP服务器端口号
限定的本地IP地址
限定的远端IP地址
呼入连接请求队列
第19章 TCP的交互数据流
Nagle算法
第20章 TCP的成块数据流
滑动窗口协议
PUSH标志
慢启动
拥塞
第21章 TCP的超时与重传
TCP管理4个定时器:
拥塞避免算法
快速重传与快速恢复算法
第22章 TCP的坚持定时器
糊涂窗口综合征sws
第23章 TCP的保活定时器
不需要使用保活定时器的:
如果一个给定的连接在2小时内没有任何动作,则服务器向客户发送一个探查报文段,客户端必须处于以下4给状态之一:
TCP/IP通常被认为使一个四层协议系统
也称为数据链路层或网络接口层。通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。他们一起处理与电缆(或其他任何传输媒介)的物理接口细节.
也称互联网层。处理分组在网络中的活动,例如分组的选路。在tcp/ip协议族中,网络层协议包括ip(网际协议)协议,icmp(internet互联网控制报文协议),igmp(internet组管理协议)
主要为两台主机上的应用程序提供端到端的通信,在tcp/ip协议族中,有两个互不相同的传输协议:tcp(传输控制协议),udp(用户数据报协议)。
为两台主机提供高可靠性的数据通信。把应用程序交给他的数据部分分成合适的小块交给下面的网络层,确认收到的分组,设置发送最后确认分组的超时时钟等。由于传输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。
为应用层提供非常简单的服务。只把用户数据报的分组从一台主机发送到另一台主机,并不保证数据报能到达另一端。任何必须的可靠性必须由应用层提供。
负责处理特定的应用程序细节。
大部分网络应用程序在编写时都假设一端是客户,另一端是服务器,其目的是为了让扶额u去为客户端提供一些特定的服务。
这种服务分为重复型或者并发型。
1.等待一个客户请求的到来
2.处理客户请求(重复型主要问题发生在这个环节,在这时,它不能为其他客户机提供服务)
3.发送响应给发送请求的客户
4.返回第1点。
1.等待一个客户请求的到来
2.启动一个新的服务器来处理这个客户的请求。这器间可能生成一个新的进程、任务或线程,并依赖底层操作系统的支持。这个步骤如何进行取决于操作系统,生成的新服务器对客户的全部请求进行处理,处理结束后,终止这个新服务器。
3.返回第1点。
并发型服务器的有点在于利用生成其他服务器的方法来处理客户请求。也就是说每个客户端都有自己对应的服务器,如果操作系统允许多任务,那么可以同时为多个客户服务。
对于一个客户端来说,它通常并不能够辨别自己是与一个重复型或并发型服务器对话。
一般来说,TCP服务器是并发的,而UDP服务器是重复的。
服务器一般是通过端口号来识别。
客户端通常对它所使用的端口号并不关心,只需要保证该端口号在本机上是唯一的。客户端端口号又称作临时端口号,因为通常只是在允许该客户端程序时才存在,而服务器开着,服务就运行。
1.为ip模块发送和接收ip数据报
2.为arp模块发送arp请求和接收arp应答
3.为rarp发送给rarp请求和接收rarp应答
A类网络号127为环回接口预留。大多数系统把127.0.0.1分配给这个接口,并命名为localhost,一个传给环回接口的ip数据报不能再任何网络上出现。一旦传输层检测到目的端地址是环回地址时,要么省略部分传输层和网络层的逻辑操作,要么当ip数据报离开网络层时把他返回给自己。
1.传给环回地址(一般127.0.0.1)的任何 数据均作为ip输入
2.传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这是因为广播传送和多播传送的定义包括主机本身。
3.任何传给该主机ip地址的数据均送到环回接口。
如果ip层有一个数据报要传,而且数据长度比链路层的MTU还大,那么ip层就需要进行分片,把数据报分成若干片,这样每一片都小于MTU。
当再同一个网络上的两台主机互相进行通信时,该网络的MTU是非常重要的。但是如果两台主机之间的通信需要多个网络,那么每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU值,而是两台主机路径中最小MTU,被称为路径MTU。
两台主机之间的MTU不一定是个常数。取决于当时所选择的路由,而选路不一定是对称的,因此路径MTU在两个方向上不一定是一致的。
ip协议是TCP/IP协议族中最为核心的协议。所有TCP、UDP、ICMP、IGMP数据都以ip数据报格式传输。
提供不可靠、无连接的数据报服务
不能保证IP数据报能成功的到达目的地。IP仅能提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,ip有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息给信源端。任何要求的可靠性必须由上层提供。
IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一个信源向相同的信宿发送两个连续的数据报,每个数据报都是独立的进行路由选择,可能选择不同的路线,因此到达顺序是不固定的。
数据报的IP校验和
1.把检验和字段置0
2.对首部中每个16bit进行二进制反码求和,结果存在检验和字段中
3.当收到一份IP数据报后,同样对首部中每个16bit进行二进制反码求和。
由于接收方在计算过程中包含了发送方存在首部中的检验和,因此如果首部在传输过程中没有任何差错,那么接收方计算的结果应该全是1.如果校验和结果不是1,出了差错,IP就丢弃收到的数据报,但是不产生差错报文,由上层去发现丢失的数据报并进行重传。
如目的主机与源主机直接相连(如点对点链路)或都发生在一个共享网络上(以太网或者令牌环网),那么IP数据报就直接送到目的主机上。否则,主机把数据报发往一个默认的路由器上,由路由器来转发该数据报。大多数主机都采用这种机制。
在一般体制中,IP可以从TCP\UDP\ICMP\IGMP接收数据报进行发送,或者从一个网络接口接收数据报并进行发送。
IP层在内存中有一个路由链表。当收到一份数据报并进行发送时,它都要对该表搜索一次。
当数据报来自某个网络接口时,IP首先检查目的IP地址是否为本机的IP地址之一或者IP广播地址。如果时这样,数据报就被送到由IP首部协议字段所指定的协议模块进行处理。如果数据报的目的地址不是这些地址,那么:
1.如果IP层被设置为路由器的功能,那么就对数据报进行转发
2.该数据被丢弃。
1.目的IP地址。既可以是一个完整的主机地址,也可以是一个网络地址,由该表目中的标志字段来指定。主机地址有一个非0的主机号,以指定某一特定的主机,而网络地址中的主机号为0,以指定网络中的所有主机。
2.下一站(或下一跳)路由器的IP地址,或者由直接连接的网络IP地址。下一站路由器是指一个在字节相连网络上的路由器,通过它可以转发数据报,下一站路由器不是最终的目的,但是他可以把传送给他的数据报转发到最终目的。
3.标志。其中一个标志指明目的IP地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口。
4.为数据报的传输指定一个网络接口。
IP路由选择是逐跳进行的。从这个路由表的信息,IP并不知道到达任何目的的完整路径(除了那么与主机直接相连的)。所有的IP路由选择只为数据报传输提供下一站路由器的IP地址。它假定下一站路由器比发送数据报的主机更接近目的,而且下一站路由器与该主机是直接相连的。
1.搜索路由表,寻找能与目的IP地址完全匹配的表目(网络号与主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口。
2.搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或者直接连接的网络接口。目的网络上的所有主机都可以通过这个表目来处置。以太网上的所有主机都是通过这种表目寻径的。
这种方法必须考虑到可能的子网掩码。
3.搜索路由表,寻找标为“默认”的表目。如果找到,则把报文发送给该表目指定的下一站路由器。
如果上面的步骤都没有成功,那么该数据包就不能被发送。如果不能给发送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个"主机不可达"或者“网络不可达”的错误。
完整主机地址匹配在网络号匹配之前执行,只有当他们都失败后才会选择默认路由。默认路由,以及下一站路由器发送的ICMP间接报文(如果我们为数据报选择了错误的默认路由),是IP路由选择机制中功能强大的特性。
为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是IP路由选择机制的另一个基本特性,这样做可以极大的缩小路由表的规模。
ARP为IP地址到对应硬件地址之间提供动态映射,这个过程自动完成。
RARP(逆地址解析协议)是那些没有被磁盘驱动器的系统使用,需要系统管理员进行手动设置。
当在终端输入:% ftp bsdi,会有以下步骤完成:
1.应用程序FTP客户端调用函数gethostbyname()把主机名bsdi转换成32bit的IP地址。这个函数在DNS中称作解析器。
2.FTP客户端请求TCP用得到的IP地址建立连接
3.TCP发送一个连接请求分段到远端的主机,即用得到的IP地址发送IP数据报。
4.如果目的主机在本地网络上,那么IP数据报可以直接送到目的主机。如果目的主机在远程网络上,就通过IP路由选择确定位于本地网络的下一站路由地址,并让他转发IP数据报
5.假定是一个以太网,那么发送端主机必须把32bit的IP地址变换成48bit的以太网地址。从逻辑internet地址到对应的物理硬件地址需要ARP协议帮助。
6.ARP发送一份称作ARP请求的以太网数据帧给以太网上的每个主机。这个过程称作广播ARP请求数据帧中包含目的主机的IP地址。
7.目的主机的ARP层收到这份广播报文后,识别出这是发送端在询问它的IP地址,于是发送一个ARP应答。这个ARP应答包含IP地址以及对应的硬件地址。
8.收到ARP应答后,使ARP进行请求-应答交换的IP数据报现在就可以传送了。
9.发送IP数据报大目的主机。
网络接口有一个硬件地址(一个48bit的值,标识不同的以太网或令牌环网络接口)。在硬件层次上进行的数据帧交换必须有正确的接口地址。但是,TCP/IP有自己的地址:32bit的IP地址。内核(以太网驱动程序)必须知道目的端的硬件地址才能发送数据。ARP的功能是在32bit的IP地址和采用不同网络技术的硬件地址间提供动态映射。
点对点链路不使用ARP。当设置这些链路时,必须告知内核链路每一段的IP地址。
ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存。存放了最近internet地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为20分钟,起始时间从被创建时开始算起。
客户IP地址及端口号----允许一个交互UDP服务器对多个客户进行处理
来自客户的是UDP数据报,IP首部包含源端和目的端IP地址,UDP首部包含源端和目的端的UDP端口号。当一个应用程序接收到UDP数据报时,操作系统必须告诉它是谁发了这份消息,即源IP地址与源端口。
一些应用程序需要知道数据报是发送给谁的,即目的IP地址。
通常,程序使用的每个UDP端口都与一个有限大小的输入队列相关联。来自不同客户的差不多同时到达的请求将由UDP自动排队,接收到的UDP数据报以接收的顺序交给应用程序。
排队溢出可能造成内核中UDP模块丢弃数据报
大多数UDP服务器在创建UDP端点时都使其IP地址具有通配符的特点,这就表明进入的UDP数据报如果其目的地为服务器端口,那么在任何本地接口均可接收到它。
广播:将数据报发送到网络中的所有主机(通常是本地相连的网络)
多播:将数据报发送到网络的一个主机组。(将一种报文发往多个接收者的通信方式)
指向网络的广播是主机号全为1的地址
指向子网的广播是主机号全为1且由特定子网号的地址。
IGMP报文通过IP数据传输。由固定长度。没有可选数据
多播的基础就是一个进程的概念,该进程在一个主机给定的接口上加入了一个多播组。在一个给定接口上的多播组中的成员是动态的,随时因进程加入和离开多播组。
多播路由器使用IGMP报文来记录与该路由器相连网络中成员的变化。
1.当第一个进程加入一个组时,主机就发送一个IGMP报告。如果一个主机的多个进程加入同一组,只发送一个IGMP报告。这个报告被发送到进程加入组所在的同一个接口上。
2.进程离开一个组时,主机不发送IGMP报告,即便是组中最后一个进程离开。主机知道在确定的组中不再有组成员后,在随后收到的IGMP查询中就不再发送报告报文。
3.多播路由器定时发送IGMP查询来了解是否还有任何主机包含有属于多播组的进程。多播路由器必须向每个接口发送一个IGMP查询。因为路由器希望主机对他加入的每个多播组均发回一个报告,因此IGMP查询报文在的组地址被设置为0.
4.主机通过 发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要发回IGMP报告。
使用这些查询和报告报文,多播路由器对每个接口保持一个表,表中记录接口上至少还包含一个主机的多播组。当路由器收到要转发的多播组数据报时,它只将该数据报转发到还拥有那个组主机的接口上。
应用程序通过名字解析器将一个主机名转换成一个ip地址,也将一个IP地址转换为与之对应的主机名。名字解析器将向一个本地名字服务器发出查询请求,这个名字服务器可能通过某个根名字服务器或其他名字服务器来完成这个查询。
DNS服务器的端口是53,意味着既支持UDP也支持TCP。
当名字解析器发出一个查询请求,并且返回响应中的TC(删除)比特被设置为1,就意味着响应长度超过了512字节,而仅返回前512个字节。在这种情况下,名字解析器通常使用TCP重发原来的查询请求,将允许返回的响应超过512个字节。
BOOTP使用UDP,为引导无盘系统获得它的IP地址提供了除RARP外的另一种选择。还能返回路由器IP地址、客户的子网掩码和名字服务器的IP地址。
TCP提供面向连接,可靠的字节流服务。
意味着客户端和服务器在彼此交换数据之前必须先建立TCP连接。
1.应用数据被分割成TCP认为最合适发送的数据库,(UDP是数据报长度保持不变),由TCP传递给IP的信息单位称为报文段或段(segment)。
2.当TCP收到一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
3.当TCP收到发自TCP连接另一端的数据,它将发送一个确认,这个确认不是立即发送,通常将推迟几分之一秒。
4.TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到的检验和由差错,TCP将丢弃这个报文段和不确认收到此报文段。(希望发送端超时重发)
5.既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果由必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
6.既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
7.TCP提供流量限制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这将防止较快主机致使较慢主机的缓冲区溢出。
TCP流量控制由连接的每一段通过声明的窗口大小来提供,窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期接收的字节。
检验和覆盖了整个TCP报文段:TCP首部和TCP数据。这是一个强制性字段,一定是发送端计算和存储,并由接收端进行验证。
https://blog.csdn.net/xuzhangze/article/details/80490362
TCP检验和的计算与UDP一样,在计算时要加上12byte的伪首部,检验范围包括TCP首部及数据部分。但是UDP的检验和字段是可选的,而TCP是必填的。
计算方法:在发送方把整个报文段分为多个16位的段,然后将所有字段进行反码相加,将结果存放在检验和字段中,接收方用相同的方法进行计算,如果最终结果位检验字段所有位是1则正确(UDP中为0正确),否则存在错误。
TCP将每个字节的数据都进行了编号,这就是序列号。
序列号的作用:
1.保证可靠性(当接收到的数据笑了某个序号的数据时能马上知道)
2.保证数据的按序到达
3.提高效率,可实现多次发送,一次确认
4.去除重复数据。
传输过程中的确认应答处理、重发控制以及重复控制等都可以通过序列号实现。
TCP通过ACK机制来实现可靠的数据传输。在TCP的首部中有一个标志位ACK,此标志位表示确认号是否有效。接收方对于按序到达的数据会进行确认,当ACK=1时确认首部的确认字段有效。进行确认时,确认字段值表示这个值之前的数据都已经按序到达了,而发送方如果收到了已发送的数据的确认报文,则继续传输下一部分的数据,如果等待了一段时间还没有收到确认报文就会启动重传机制。
当报文发出一段时间内未收到接收方的确认,发送方就会进行重传(通常是在发出报文段后设定一个闹钟,到点了还没有收到应答则进行重传)。过程如下:
当接收方收到重复的数据时就将其丢掉,重新发送ACK。而要识别出重复的数据,就要用到前面提到的序列号了,利用序列号很容易做到去重效果。
重传时间的确定:
报文段发出到收到应答中间有一个报文段的往返时间RTT,显然超时重传时间RTO会略大于RTT。TCP会根据网络情况动态的计算RTT, RTO是不断变化的。在Linux中,超时以500ms未单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。
规律为:
如果重发一次仍得不到应答,就等待2 * 500 ms后再进行重传,如果仍得不到应答就等到4 * 500 ms后重传。依次类推,以指数形式递增,重传次数累计到一定次数后,TCP认为网络或对端主机出现异常,就会强行关闭连接。
即TCP的三次握手和四次挥手
接收端处理数据的速度是优先的,如果发送反发送数据的速度过快,导致接收端缓冲区满,而发送方持续发送就会造成丢包,进而引起丢包重传等一系列连锁反应。
因此TCP根据接收端的处理能力,来决定发送端的速度,即流量控制。
在TCP报文段首部中有一个16位窗口长度,当接收端接收到发送方的数据后,在应答ACK中就将自身缓冲区的剩余大小放入16位的窗口大小中。这个大小随着数据传输情况变化,窗口越大,网络吞吐量越高,而一旦接收方发现自身的缓冲区快满了,就将窗口设置位更小的值通知发送方。如果缓冲区满就将窗口置为0,发送方收到后不再发送数据,但是需要顶起发送一个窗口探测数据段,使接收端把窗口大小高速发送端。
流量控制解决了两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然后如果网络拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。
因此TCP引入慢启动机制,先发出少量数据就像探路一样,先摸清当前网络拥堵状态后,再决定按照多大的速度传送数据。
开始发送时,拥塞窗口大小位1, 每次收到一个ACK应答,拥塞窗口加1,而在每次发送数据时,发送窗口取拥塞窗口与接收端接收窗口的最小值。
慢启动:
在启动初期以指数增长方式增长,设置一个慢启动阈值,当以指数增长达到阈值时就停止指数增长按照线性方式增长。线性增长达到网络拥塞时立即“乘法减小”,拥塞窗口置回1,进行新一轮的慢启动,新一轮的阈值变为原来的一半。
1) netstat -nat
#查看TCP各个状态的数量
2)lsof -i:port
#可以检测到打开套接字的状况
3) sar -n SOCK
#查看tcp创建的连接数
4) tcpdump -iany tcp port 9000
#对tcp端口为9000的进行抓包
1.请求端(客户端)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号ISN,这个SYN段位报文段1.
2.服务器发回包含服务器的初始序号的SYN报文段(报文段2)作为应答。同时,将确认需要设置位客户的ISN+ 1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
3.客户端必须将确认序号设置位服务器的ISN+1,以对服务器的SYN段报文段进行确认(报文段3).
连接的一端在结束它的发送后还能接收来自另一端数据的能力,即所谓的半关闭。
TIME_WAIT也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生成时间MSL。是任何报文段被丢弃前在网络内的最长时间。这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段。
对于来自某个连接的较早替身的迟到报文段,2MSL等待可以防止将它解释称使用相同插口对的新连接的一部分。但这只有处于2MSL等待连接中的主机处于正常工作状态时才有效。
如果使用处于2MSL等待端口的主机出现故障,它会在MSl秒内重新启动。如果使用故障前仍处于2MSL的插口建立新的连接,那么在故障前从这个连接发出而迟到的报文段会被错误的当作属于重启后新连接的报文段。无论如何选择重启后新连接的初始序号,都会发生这种情况。
为了避免上述情况,RFC793指出TCP在重启后的MSL秒内不能建立任何连接。即平静时间。
如果一方已经关闭或异常终止连接,而另一方却还不知道,将这样的TCP连接称为半打开。任何一端的主机异常都可能导致这种情况发生。只要不打算在半打开连接上传输数据,仍处于连接状态的乙方就不会检测另一方已经出现异常。
一个并发服务器调用一个新的进程来处理每个客户的请求,因此处于被动连接请求的服务器应该始终准备处理下一个呼入的链接请求。这正是使用并发服务器的根本原因。
但仍有可能出现当服务器正在创建一个新的进程时,或操作系统正忙于处理优先级更高的进程时,到达多个连接请求。此时TCP:
1.正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接已被TCP接受(即三次握手已经完成),但还没有被应用层接受。TCP接受这个连接放入队列,应用层接受连接从该队列取出。
2.应用层将指明该队列的最大长度,这个值通常称为积压值。它的取值范围是0-5之间的整数,包括0和5.
3.当有一个请求(即SYN)到达时,TCP使用一个算法,根据当前连接队列中的连接数来确定是否接收这个连接。
4.如果对于新的连接请求,该TCP监听的端点的连接队列中还有空间,TCP模块将对SYN进行确认并完成连接的建立。但应用层只有在三次握手中的第三个报文段收到后才会知道这个新连接。另外,当客户端主动打开成功但服务器的应用层还不知道这个新连接时,它可能会认为服务器进程已经准备号接收数据了,此时服务器的TCP将接收的数据放入缓冲队列。
5.如果对于新的连接请求,连接队列已经没有空间,TCP将不会理会收到的SYN,也不会发回任何报文段。如果应用层不及时接收已被TCP接受的连接,这些连接可能占满队列,客户端的主动打开将超时。
一个TCP连接上最多只能由一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去。
该算法的优越之处在于自适应:确认到达的越快,数据也就发送的越快。而在希望减少分校分组数目的低速广域网上,则会发送更少的分组。
允许发送方在停止并等到确认前可以连续发送多个分组,由于发送方不必每发一个分组就停下来等待确认,可加速数据的传输。
当接收方确认后,滑动窗口不时的向右移动,窗口两个边沿的相对运动增加或减少了窗口的大小。
1.窗口合拢:窗口左边向右移动靠近。发生在数据被发送和确认时。
2.窗口张开:窗口右边向右移动,允许发送更多的数据。发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存
3.窗口收缩:右边向左移动
发送方使用PUSH标志通知接收方将所收到的数据全部交给接收进程。这里的数据包括与PUSH一起传送的数据以及接收方TCP已经为接收进程收到的其他数据。
通过允许客户应用程序通知其TCP设置PUSH标志,客户进程通知TCP在向服务器发送一个报文段时不要因等待额外数据而使已经提交的数据在缓存中滞留。当服务器TCP收到一个设置了PUSH标志的报文段,它需要立即将这些数据递交给服务器进程而不能等待判断是否还有额外的数据到达。
通过观察新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口,记为cwnd。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段。每收到一个ACK,拥塞窗口就增加一个报文段。发送方取拥塞窗口中的最小值作为发送上线。拥塞窗口是发送方使用的流量控制,而通告窗口是接收方使用的流量控制。
发送方开始时发送一个报文段,然后等待ACK,当接收该ACK时,拥塞窗口从1增加到2,即可以发送两个报文段,当收到这两个报文段的ACK,拥塞窗口就增加为4.是指数增加的关系。
通常发送一个分组的时间取决于两个因素:传播时延和媒体流速的发送时延。对于给定的两个节点之间的通路,传播时延一般是固定的,而发送时延则取决于分组大小。在速率较慢的情况下发送时延起主要作用。
当数据到达一个大的管道并向一个较小的管道发送时便会发生拥塞。
当多个输入流到达一个路由器,而路由器的输出流小于这些输入流的综合也会发生拥塞。
TCP提供可靠的传输层,使用的方法之一是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这个问题。
如果定时器溢出时还没收到确认,它就重传该数据。
1.重传定时器:当希望收到另一端的确认
2.坚持定时器:使窗口大小信息保持不断流动,即使另一端关闭了接收窗口
3.保活定时器:检测到一个空闲连接的另一端何时崩溃或重启
4.2MSL定时器测量一个连接处于TIME_WAIT状态的时间
假定由于分组受到损坏引起的丢失是非常少的,因此分组丢失就意味着在源主机和目的主机之间的某处网络发生了拥塞。。
有两种分组丢失的指示:发生超时和收到重复的确认
当拥塞发生时,希望降低分组进入网络的传输速率,可以调用慢启动来实现。拥塞避免和慢启动通常一起实现。
TCP能够遇到的最常见的ICMP差错就是源站抑制、主机不可达和网络不可达。
重新分组
当TCP超时并重传时,它不一定要重传同样的报文段,相反,TCP允许进行重新分组而发送一个较大的报文段,这有助于提高性能
在连接的一方需要发送数据但对方已通告窗口大小为0时,就需要设置T C P的坚持定时器
TCP通过让接收方指明希望从发送方接收的数据字节数(即窗口大小)来进行流量控制。
如果窗口为0 呢?
如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据,而发送方在等待允许它继续发送数据的窗口更新。为了防止这种死锁情况发生,发送方使用一个坚持定时器来周期性的向接收方查询,以便发现窗口是否已经增大。这些从发送方发出的报文段称为窗口探查。
基于窗口的流量控制方案,会导致sws。如果发生sws,则少量的数据将通过连接进行交换,而不是满长度的报文段。
如果TCP连接的双方都没有向对方发送数据,则在两个TCP模块之间不交换任何信息。
1.在出现短暂差错的情况下,这可能会使一个非常好的连接释放掉
2.耗费不必要的带宽
3.在按分组计费的情况下会在互联网上花掉更多的钱
保活功能主要是为服务器应用程序提供的,服务器应用程序希望知道客户主机是否崩溃,从而可以代表客户使用资源。
1.客户主机依然运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常工作的。服务器在2小时后将保活定时器复位。如果在2小时定时器到时间之前有应用程序的通信量通过此连接,则定时器在交换数据后的未来2小时再复位。
2.客户主机已经崩溃,并且关闭或者正在重新启动。再任何一种情况下,客户的TCP都没有响应。服务器将不能够收到对探查的响应,并在75秒后超时。服务器总共发送10个这样的探查,每个间隔75秒。如果服务器没有收到一个响应,就认为客户主机已经关闭并终止该连接。
3.客户主机崩溃并已经重新启动。这时服务器将收到一个对其保活探查的响应,但是这个响应是复位,使得服务器终止这个连接。
4.客户主机正常运行,但是从服务器不可达。这与状态2相同,因为TCP不能够区分状态4与状态2之间的区别,它所能发现的就是没有收到探查的响应。
服务器不用关注客户主机被关闭和重新启动的情况(值得是操作员的关闭,而不是主机崩溃)。当系统被操作员关闭时,所有的应用进程也被终止(即客户进程),这会使客户的TCP在连接上发出一个FIN。接收到FIN将使服务器的TCP向服务器进程报告文件结束,使服务器可以检测到这个情况。
在第1中情况下,服务器的应用程序没有感觉到保活探查的发生,TCP负责一切。
在第2,3,4情况下,服务器应用程序将收到来自它的TCP差错报告(通常服务器已经向网络发出了读操作,然后等待来自客户的数据。如果保活功能返回一个差错,则该差错将作为读操作的返回值返回给服务器。)
在第2种情况下,差错是诸如“连接超时”值类的信息。
在第3种情况下,差错诸如“连接被对方复位”
第4中看起来是连接超时,也可以根据是否收到与连接有关的ICMP来返回其他的差错。