目录
概述
1.internet和Internet的区别
2.面向连接和无连接
3.不同的T
4.传输速率和传播速率
5.传播时延和传输时延(发送时延)
6.语法,语义和同步
一.物理层
1.传输媒体与物理层
2.同步通信和异步通信
3.位同步(比特同步)和帧同步
二.数据链路层
1.数据链路层的传输
2.使用调制解调器拨号上网的原理
3.数据链路层主要解决的三大问题
4.以太网的最小帧长和最大帧长
5.信号的功率和通信距离的关系
6.LLC帧
三.网络层
1.交换机和路由器
2.PING的IP数据报发给谁
3.类别位和网络前缀
4.前缀和后缀
5.受限广播和定向广播
6.广域网中分组不分片
7.链路层广播和IP广播区别
8.主机接收广播帧或多播帧
9.IP数据报的最大长度是多少字节
10.IP数据报的首部最大长度是多少个字节
11.触发更新,水平分割,毒性逆转
四.运输层
1.TCP和IP的不同
2.UDP和IP的主要区别
3.端口和套接字的区别
4.数据链路层的HDLC协议和运输层的TCP协议都使用滑动窗口技术。数据链路层协议和运输层协议的主要区别
5.TCP传输失败问题
6.糊涂窗口综合征
7.TCP不同的初始序号
8.慢开始
9.拥塞避免
10.TCP发送窗口大小的选择
11.TCP的必要性
12.TCP中的RTT
13.TCP的确认报文
14.TCP报文段的长度
15.大文件的传输
五.应用层
1.互联网中计算机程序之间的通信和电信网中的电话通信的区别和联系相同之处:电信网:允许一个电话机向另一个电话机发出呼叫请求(即拨打另一个电话机的号码)。
2.HTTP
六.网络安全
1.拒绝服务DOS和分布式拒绝服务DDOS
2.分组过滤器
七.无线网络和移动网络
1.SSID
以小写字母i开始的internet (互连网)是一个通用名词,它泛指由多个计算机网络互连而成的网络。在这些网络之间的通信协议(即通信规则)可以是任意的。
以大写字母I开始的Internet(互联网)则是一个专用名词,它指当前全球最大的、开放的、由众多网络相互连接而成的特定计算机网络,它采用 TCP/IP协议族作为通信的规则,且其前身是美国的ARPANET。
数据链路层
HDLC和PPP是面向连接的,而以太网使用的CSMA/CD是无连接的
网络层
X.25协议是面向连接的,而IP协议则是无连接的
运输层
TCP是面向连接的,而UDP则是无连接的
希捷公司的硬盘标记中的T表示,而微软公司Windows 软件中的T表示。3.63 x4x,即希捷公司的4TB 和微软公司的3.63TB 相等,所以如果在希捷公司购买4TB的硬盘,在Windows中该磁盘属性只有3.63TB。
传播速率:信号比特在传输媒体上的传播速率就是电磁波在单位时间内能够在传输媒体上走的距离。这个速率大约只有电磁波在真空中的传播速率的 2/3 左右。或者说,信号比特在传输媒体上1微秒可传播200米左右的距离。
传输速率:计算机每秒钟可以向所连接的媒体或网络注入(也就是发送)多少个比特则是传输速率。若计算机在单位时间内能够发送更多的比特也就是“发送速率提高了”,但一定要弄清,这里的“速率”指的是“比特/秒”而不是指“米/秒(传播速率)”。
传输时延(发送时延):
主机或路由器发送数据帧所需要的时间,也就是从发送数据的第一个比特算起,到该帧的最后一个比特发送完毕所需的时间。发送时延也称为传输时延。
发送时延 = 数据帧长度(b) / 信道带宽(b/s)
发送时延=传输时延传播时延
传播时延:
传播时延是电磁波在信道中传播一定的距离需要花费的时间。
传播时延 = 信道长度(m) / 电磁波在信道上的传播速率(m/s)
(电磁波在信道上的传播速率接近光速)
语法:数据与控制信息的结构或格式
语义:需要发出何种控制信息、完成何种动作以及做出何种响应。但语义并没有说明应当在什么时候做这些动作,所以语义并不包括同步,而“同步”则详细说明这些事情实现的顺序
同步:实现顺序的详细说明
传输媒体并不是物理层。传输媒体在物理层的下面。由于物理层是体系结构的第一层,因此有时称传输媒体为0层。在传输媒体中传输的是信号,但传输媒体并不知道所传输的信号代表什么意思。也就是说,传输媒体不知道所传输的信号什么时候是1什么时候是0。但物理层由于规定了电气特性,因此能够识别所传送的比特流。
异步通信
发送字符:
“异步通信”是一种很常用的通信方式。异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便宜,但传输效率较低(因为开始位和停止位的开销所占比例较大)。
发送帧:
异步通信也可以以帧作为发送的单位。接收端必须随时做好接收帧的准备。这时,帧的首部必须设有一些特殊的比特组合,使得接收端能够找出一帧的开始。这也称为帧定界。帧定界还包含确定帧的结束位置。这有两种方法
在帧的尾部设有某种特殊的比特组合来标志帧的结束
在帧首部中设有帧长度的字段
需要注意的是,在异步发送帧时,并不要求发送端对帧中的每一个字符都必须加上开始位和停止位后再发送出去,而是说,发送端可以在任意时间发送一个帧,而帧与帧之间的时间间隔也可以是任意的。在一帧中的所有比特是连续发送的。发送端不需要在发送一帧之前和接收端进行协调(不需要先进行比特同步)。
异步发送字符:必须要有开始位和停止位
异步发送帧:不一定要有开始位和停止位,一定要有帧定界
同步通信
“同步通信”的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。但这时还有两种不同的同步方式:
使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步。
使用准同步,各结点的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。
位同步:
在数据通信中最基本的同步方式就是“位同步”(bitsynchronization)或比特同步。比特是数据传输的最小单位。位同步(比特同步)是指接收端时钟已经调整到和发送端时钟完全一样,因此接收端收到比特流后,就能够在每一位的中间位置进行判决。位同步(比特同步)的目的是为了将发送端发送的每一个比特都正确地接收下来。这就要在正确的时刻(通常就是在每一位的中间位置)对收到的电平根据事先已约定好的规则进行判决。例如,电平若超过一定数值则为1,否则为0。
帧同步:
仅仅有位同步还不够,因为数据要以帧为单位进行发送。若某一个有差错,以后就重传这个出错的帧。因此一个帧应当有明确的界限,也就是说,要有帧定界符。接收端在收到比特流后,必须能够正确地找出帧定界符,以便知道哪些比特构成一个帧。接收端找到了帧定界符并确定顿的准确位置,就是完成了“同步”(framesynchronization)。
在使用 PCM 的时分复用通信中(这种通信都采用同步通信方式),接收端仅仅能够正确接收比特流是不够的。接收端还必须准确地将一个个时分复用帧区分出来。因此要利用特殊的时隙(包含有一些特殊的比特组合),使接收端能够把每一个时分复用的位置确定出来。这也叫做帧同步。
时分复用通信中的帧同步:
这里的同步通信方式在电信网中使用得非常广泛,其中的一个重要特点是在发送端连续不断地发送的比特流中,即使有的时隙没有被用户使用,但用于同步的时隙也要保留在时分复用帧中的相应位置上。在同步通信中,帧同步的任务就是使接收端能够从收到的连续比特流中确定出每一个时分复用帧的位置。
数据帧同步:
这里的异步通信方式在计算机网络中使用得较多。我们可以注意到,数据帧在接收端出现的时间是不规则的。因此在接收端必须进行帧定界。但帧定界也常称为帧同步。因此,当我们看到“帧同步”时,应当弄清这是同步通信中的帧同步,还是异步通信中的帧定界。
注:在异步通信时,接收端即使找到了数据帧的开始处,也还必须将数据帧中的所有比特逐个接收下来。因此,接收端必须和数据帧中的各个比特进行比特同步(这就是异步通信中的同步问题)。试想:如果接收端不知道每一个比特要持续多长时间,那么怎样能将一个个比特接收下来呢?因此,不管是同步通信还是异步通信,要想接收比特块中的每一个比特,就必须和比特块中的比特进行位同步(比特同步)。
然而在异步通信中,位同步(比特同步)的方法和同步通信时并不完全一样。
在同步通信中,最精确的同步方法是使全网时钟精确同步。全网的主时钟的长期精度要求达到1.0,因此必须采用原子钟(例如,原子钟),但这样的同步网络的价格很高(如SDH/SONET 网络)。实际上,在同步通信中,也可以采用比较经济的方法实现同步。这种方法就是在接收端设法从收到的比特流中将位同步的时钟信息提取出来(发送端在发送比特流时,发送时钟的信息就已经在所发送的比特流之中了)。这种同步方式常称为准同步(plesiochronous)。曼斯特编码能够使接收端很方便地从收到的比特流中将时钟信息提取出来,这样就能够很容易地实现位同步。
在以帧为传送单位的异步通信中,接收端通常也是采用从收到的比特流中提取时钟信息的方法来实现位同步的。在以字符为单位的异步通信中,由于每一个字符只有 8个比特,因此只要收发双方的时钟频率相差不太大,在开始位的触发下,这 8 个比特的位同步很容易做到,因此不需要采取其他措施来实现位同步(但不等于说可以不要位同步)。
在之前数据链路层的阐述是基于OSI体系结构的。OSI体系结构的数据链路层采用的是面向连接的HDLC协议。他提供的是可靠传输的服务。
但现在互联网的数据链路层协议使用的最多的是PPP协议和CSMA/CD协议。这两种协议不使用序号和确认机制。当接收端通过差错检测发现帧在传输中出了差错,默默丢弃而不进行任何其他处理。如果需要可靠传输,那么就由高层的TCP负责重传,但数据链路层并不知道这时重传的帧。
一个办公室内只有一对电话用户线可供拨号上互联网,但办公室内有多人在办公,他们都有自己的 PC,而且都想同时使用拨号上网。这时可将所有用户的 PC 都用以太网连接起来(当然每一台 PC都必须安装一个以太网卡)。只有一台 PC 要特殊些,即需要同时安装以太网卡和拨号上网卡 (或使用外置的调制解调器)。这台特殊的 PC 通常叫做代理服务器,它通过调制解调器用拨号方式与本地的ISP相连。代理服务器必须安装专门的软件(如Wingate2.0),同时还要完成一些必要的配置,这样就能使连接在以太网上的各 PC 用共享一个调制解调器的方式同时上网。ISP并不知道有多少人共享一个调制解调器。ISP 只知道现在是这台代理服务器在使用拨号上网。ISP只需分配一个临时的IP地址给此代理服务器暂时使用。
•差错检测
保证上交主机的帧都是没有传输差错的,有差错的都已经丢弃。
补充(可能发送了512bit(64B)以后才发生碰撞)
产生迟到的碰撞是因为网络覆盖的地理范围太大了,以致人为干扰信号在网络上传播的时间太长,使得有的站在发送 512 bit (64 B)以后才知道在以太网上发生了碰撞。
这时该站就立即停止发送数据,但已经发送出去的数据长度却超过了以太网规定的最短长度(64 B)。具有这种大于64 字节的 MAC 属于合法的,接收端必须将它收下来。在进行差错检测后就可发现这是个有差错的帧,最后还是会将它丢弃。这时,要由高层来进行重传,结果浪费了时间。如果能够及时发现碰撞,则 MAC 层协议会自动对该帧进行重传,这显然要节省一些时间。
•帧定界
帧定界就是要使接收端能够知道一帧的开始和结束是在什么地方。面向字符的数据传输就是所传输的数据全都是一个个的字符,例如ASCII 字符。因此,在每一帧的开始和结束的地方,必须有一个特殊的字符来作为标志,如下所示:
字符SOH代表Start Of Header (首部开始),而EOT代表 End Of Transmission(传输结束)。
请注意,SOH和EOT 都是 ASCII码中的控制字符。SOH 的十六进制编码是 01,而EOT的十六进制编码是04。不要误认为SOH 是"S","O","H"三个字符,也不要误认为 EOT是"E","O","T"三个字符。
•透明传输
透明传输实际上就是随便什么字符都可以传输。但设想我们在帧中传送的字符出现了一个控制字符“EOT”。那么接收端收到这样的数据后,就会将原来的SOH和数据中的“EOT错误地解释为一个帧,但对后面剩下的字符根本就无法解释。
为了解决透明传输问题,就必须设法将数据中可能出现的控制字符”SOH“和”EOT“在接收端不解释为控制字符。方法是:在数据中出现字符“SOH”或“EOT”时就将其转换为另一个字符,而这个字符是不会被错误解释的。但所有字符都有可能在数据中出现。于是就想出了这样的办法:将数据中出现的字符“SOH”转换为“ESC”“x”这样两个字符,将数据中出现的字符“EOT”转换为“ESC”“y”这样两个字符。而当数据中出现了控制字符“ESC”时,就将其转换为“ESC”“2”这样两个字符。这种转换方法就能够在接收端正确地还原为原来的数据。“ESC”是转义符,它的十六进制编码是1B。下图表示在数据中出现了四个控制字符“ESC”,“EOT”,“ESC”,“SOH”。
在以太网上发送一个帧时,并非全网都能瞬时地检测出这个帧的发送。这是因为电磁波在以太网上的传播速度是有限的。当某个站刚刚发送数据后不久就检测到发生冲突时,就必须丢弃这个受到损伤的帧。这种帧就是因发生碰撞而异常中止的短帧。如果一个站只有非常少的数据要发送,帧就会很短。如果让这种帧在以太网上传送,那么就无法和因发生碰撞而异常中止的短帧相区分。前者是有用的帧,而后者是无用的帧。
现在设置最小帧长就是为了区分开这两种情况。对于有用的非常短的帧,以太网标准规定要在数据部分进行填充,使其长度达到以太网标准规定的最小帧长的长度。因发生碰撞而异常中止的短帧的长度肯定都是小于最小帧长的长度。
如果以太网上偶尔出现噪声,这也会形成很短的帧,其长度也是小于以太网标准规定的最小长的长度。规定了最小帧长就可以把由噪声产生的短帧丢弃。
设置最大帧长是为了保证各个站都能公平竞争接入到以太网。因为如果某个站发送特长的数据帧,则其他的站就必须等待很长的时间才能发送数据。
能否正确接收信号并非取决于信号的绝对功率大小,而是取决于信噪比。以太网信道中的噪声主要是其他双绞线中的信号通过电磁感应所造成的。如果所有的站都提高信号的发送功率,那么这种噪声功率也随之增大,结果信噪比并未提高,因而并没有降低误码率。所以依靠增大信号的发送功率是不能增大以太网的通信距离的。
在互联网中的IP 数据报从TCP/IP 体系中的网络层传送到下面的以太网时往往是直接将IP数据报封装到MAC中,而不使用LLC子层,这样在网络抓包的时候,就无法找出LLC帧首部各字段的值。
交换机和路由器的功能是很不一样的。
交换机可在一个单个的网络中和若干个计算机相连,并且可以将一个计算机发送过来的转发给另一个计算机。从这一点上看,交换机具有集线器的转发帧的功能。
但交换机比集线器的功能强很多。集线器在同一时间只允许一个计算机和其他计算机进行通信,但交换机允许多个计算机同时进行通信。
路由器连接两个或几个网络,路由器可在网络之间转发分组(即 IP 数据报)。特别是这些互连的网络可以是异构的。
因此,如果是许多相同类型的网络互连在一起,那么用一个很大的交换机(如果能够找得到)代替原来的一些路由器是可以的。但目前的互联网是非常多的异构网络互连起来的,我们不可能找到一种交换机可以代替互联网中的全部路由器。因此,必须使用许多的路由器来进行网络互连。
127.0.0.1是环回地址。主机将测试用的IP 数据报发送给本主机的ICMP(而不是发送到互联网上)以便进行环回测试。
网络前缀是指整个的网络号字段,即包括了最前面的几个类别位在内。网络前缀常常就简称为前缀。请注意,网络前缀不能把前面的类别位除外。
例如一个B类地址,10100000 00000000 00000000 00010000,其类别位就是最前面的两位:10,而网络前缀就是前 16位:10100000 00000000。
前缀(prefix)就是网络号字段net-id,而后缀(sufix)就是主机号字段 host-id。
以C类地址为例来说明前缀和后缀
(1)前缀是由互联网管理机构进行分配的,而后缀是由分配到前缀的单位自行分配的。
(2)IP 数据报的寻址是根据前缀来找目的网络,找到目的网络后再根据后缀找到目的主机。
如果是向整个互联网进行广播的地址,那么一定会在互联网上产生极大的通信量,这样会严重地影响互联网的正常工作,甚至还会使互联网瘫痪。
因此,在IP 地址中的全1地址表示仅在本网络上(就是发送这个P 数据报的主机所连接的局域网)进行广播。这种广播叫做受限的广播(limited broadcast)。
如果net-id 是具体的网络号,而 host-id 是全1,就叫做定向广播(directed broadcast),因为这是对某一个具体的网络(即net-id 指明的网络)上的所有主机进行广播的一种地址
IP 数据报可能要经过许多个网络,而源主机事先并不知道数据报后面要经过的这些网络所能通过的分组的最大长度是多少。等到IP 数据报转发到某个网络时,可能才发现数据报太长了,因此在这时就必须进行分片。
但广域网能够通过的分组的最大长度是该广域网中所有主机都事先知道的,源主机不可能发送网络不支持的过长分组,因此广域网就没有必要将已经发送出的分组再进行分片。
链路层广播是用数据链路层协议(在第二层),在一个以太网上实现的对该局域网上所有主机的MAC进行广播。
IP 广播则是用IP 协议(在第三层),通过互联网实现的对一个网络(即目的网络)上所有主机的IP数据报广播
在接收广播帧时,主机通过其适配器(即网络接口卡 NIC)接收每一个广播帧,然后将其传递给操作系统。CPU 执行协议软件,并界定是否接受和处理该帧。
在接收多播帧时,CPU 要对适配器进行配置,而适配器根据特定的多播地址表来接收帧凡与此多播地址表不匹配的帧都将被 NIC 丢弃。因此在多播的情况下,是适配器NIC 而不是CPU 决定是否接收一个帧。
最大长度是 64 KB(1 K=2,因为其首部的总长度字段只有 16 位长。但实际上最多只能表示65535字节而不是65536字节,因为在二进制中的16个1表示十进制的(-1)
请注意:这里所说的最大长度是指 IP 协议给 IP数据报长度规定的上限,是不允许超过的。但若IP 数据报的长度超过了数据链路层的最大传送单元MTU,或超过了路由器和主机能够处理的长度限制,那么在传送这种 IP 数据报时就必须进行分片,而分片将导致IP数据报的传输效率下降,应当尽可能避免。
IP 协议规定,所有的主机和路由器必须能够处理的 IP 数据报长度不得小于 576 字节这就是说,只要IP 数据报的长度不超过 576字节,这样的IP数据报通过互联网时就肯定不需要进行分片(数据链路层的 MTU 没有小于576字节的,因此不必考虑数据链路层是否能够传送576字节长的数据)。
当IP数据报的长度超过576字节但小于65535字节时,肯定是能够通过互联网的,但是否需要进行分片,则取决于:
(1)这个长度是否超过数据链路层的MTU值
(2)这个长度是否超过途经路由器的处理能力。
顺便指出,上面提到的 576 字节是这样得到的。考虑要传送的数据长度是 512 字节,加上20字节的固定IP 首部和最多40字节的可变IP 首部,共572字节。再考虑有4字节的富裕量,就得出了576字节。
请注意:576字节是IPv4 规定的数值。现在IPv6已经把这个数值提高到了1280字节。这就是说,只要IP数据报的长度不超过 1280字节在IPv6网络中传送时,就肯定不需要进行分片。
补充:
最大传送单元MTU指的是IP层下面的数据链路层的最大传送单元,也就是下面的MAC 的数据子段,不包括 MAC 顿的首部和尾部的各字段。因为IP 数据报是装入到MAC 中的数据字段,因此数据链路层的MTU数值就是IP 数据报所容许的最大长度(是总长度,即首部加上数据字段)。
IP数据报首部中有一个首部长度字段,4位长,可表示最大十进制数字是15。因此首部长度最大值为15个4字节长的字,即60个字节。
典型的IP 数据报不使用首部中的选项,因此典型的IP 数据报首部长度是 20字节。
(1)触发更新
若网络中没有变化,则按通常的 30 秒间隔发送更新信息:若有变化,路由器就立即发送其新的路由表。这个过程叫做触发更新。
触发更新可提高稳定性。每一个路由器在收到有变化的更新信息时就立即发出新的信息,这比平均的 15 秒要少得多。虽然触发更新可大大地改进路由选择,但它不能解决所有的路由选择问题。例如,用这种方法不能处理路由器出故障的问题。
(2)分割范围
分割范围(split horizons)是提高稳定性的第二种方法(注:split horizon有不少人译为“水平分割”。实际上这里 horizon 的意思是“范围”,因此译为“分割范围”较为合适)。它在发送路由选择报文时使用了选择性,路由器必须区分不同的接口。如果路由器从一个接口已经收到了到某个网络的路由更新信息,那么到这个同样网络的路由更新信息一定不能再通过这个接口回送过去。如果一个接口通过了给某一个路由器更新的信息,那么这个更新信息一定不能再发送回去。因为这是那个路由器已经知道了的信息,因而是不需要的。分割范围可明显地提高稳定性。
R1发送[Net1,1,-]给R2,表明“我到Net1的距离是1,直接交付”。
R2从这个RIP报文进来的端口不再发送关于到Net1的信息,而只从另外的端口发送[Net1,2,R1],表明“我到Net1的距离是2,经过 R1”。
当Net1出故障后,R发送[Net1,16,-]给 R,表明“我到Netl的距离是16,直接交付”(距离是16 就表示不能到达)。
R2从另外的端口发送[Net1,16,R1],表明“我到Net1的距离是16,经过R1”。、
这样就使其他路由器很快都知道Net1出了故障。
(3)毒性逆转
毒性逆转(poison reverse)是分割范围的一种变形。使用这种方法时,路由器收到的信息用来更新路由表,然后通过所有的接口发送出去。但是,已经从一个接口来的一个路由表项目在通过同样的接口发送出去时,就要将其度量置为 16。
功能和服务的比较
通信的起点和终点的比较
进程A和进程B的通信是使用面向连接的TCP提供的可靠的传输。
主机X和主机Y的通信是使用无连接的IP提供的不可靠的传输。
注意:对 TCP来说,通信的起点和终点是运输层上面的两个套接字(socket),而应用层的应用进程正是通过应用层和运输层之间的套接字来使用TCP 提供的服务。TCP 协议根据报文段首部中的端口号找到目的端口,将报文段交付目的进程。套接字是由 IP 地址和端口号决定的,套接字也可称为“插口”
对IP 来说,通信的起点和终点是连接在网络上的两个主机。IP 协议根据数据报首部中的目的IP地址找到目的主机,将数据报交付目的主机。
虽然在两个套接字之间的通信是面向连接的,但IP 数据报在下面的网络中传输时是独立地选择路由,而不是沿着某一条固定的路径传输。然而在上面的端口看来,TCP 报文段好像都是从一个虚拟的、可靠的通信管道中传输到对方的端口的。
IP是主机到主机的通信协议,UDP是进程到进程的通信协议。
套接字包含了端口,因为套接字 =(IP 地址,端口号)。套接字是TCP 连接的端点。套接字又称为“插口”。
套接字(socket)也有其他意思。当使用API时,套接字往往被看成是操作系统的一种抽象,这时,套接字和一个文件描述符是很相似的,并且是应用编程接口 API的一部分。套接字由应用程序产生,并指明它将由客户还是服务器来使用。当应用进程创建一个套接字时,要指明该套接字使用的端口号。
注:一个套接字只能和另一个远地套接字相连
端口则是应用层服务的一种代号,它用来标志应用层的进程。端口是一个16bit 的整数。各种服务器使用的端口号都是保留端口号,以便使客户能够找到服务器。例如万维网服务器使用的端口号是80。
在发送数据时,应用层的数据通过端口向下交付运输层。在接收数据时,运输层的数据通过适当的端口向上交付应用层的某个应用程序。
•运输层的TCP 协议是端到端(进程到进程)的协议,而数据链路层的 HDLC协议则是仅在一段链路上的结点到结点的协议。
•TCP 的窗口机制和HDLC 的也有许多区别,如TCP 是按数据部分的字节数进行确认的,而 HDLC 则是以帧为确认的单位。需要注意的是,现在使用得最多的 PPP 链路层协议并不使用确认机制和窗口机制。因此像 PPP 协议这样的链路层协议就和运输层协议有相当大的区别。
以太网规定重传 16 次就认为传输失败,然后报告上层。
但 TCP 没有规定最大重传次数,而是通过设置一些计时器来解决有关传输失败的问题。
TCP共使用以下四种计时器,即重传计时器、持续计时器、保活计时器和时间等待计时器。
重传计时器
当TCP 发送报文段时,就创建该特定报文段的重传计时器。可能发生两种情况:
(1)若在计时器截止时间到来之前收到了对此特定报文段的确认,则撤销此计时器。
(2)若在收到了对此特定报文段的确认之前计时器截止期到,则重传此报文段,并将计时器复位。
持续计时器
为了对付零窗口大小通知,TCP需要另一个计时器。假定“接收TCP”给出了窗口大小为零,“发送TCP”就停止传送报文段,直到“接收TCP”发送确认并给出一个非零的窗口大小。但这个确认可能会丢失。我们知道在 TCP 中,对确认报文段是不发送确认的。若确认丢失了,“接收TCP”并不知道,而是会认为它已经完成任务了,并等待着“发送TCP”接着会发送更多的报文段。但“发送 TCP”由于没有收到确认,就等待对方发送确认来通知窗口的大小。双方的TCP都在永远地等待着对方。
要打开这种死锁,TCP为每一个连接使用一个持续计时器。当“发送TCP”收到一个窗口大小为零的确认时,就启动持续计时器。当持续计时器期限到时,“发送TCP”就发送一个特殊的报文段,叫做探测报文段。这个报文段只有一个字节的数据。它有一个序号,但它的序号永远不需要确认;甚至在计算对其他部分的数据的确认时,该序号也被忽略。探测报文段提醒接收TCP:确认已丢失,必须重传。
持续计时器的值设置为重传时间的数值。但是,若没有收到从接收端来的响应,则需发送另一个探测报文段,并将持续计时器的值加倍和复位。发送端继续发送探测报文段,将持续计时器设定的值加倍和复位,直到这个值增大到门限值(通常是 60秒)为止。在这以后,发送端每隔60秒就发送一个探测报文段,直到窗口重新打开。
保活计时器
保活计时器使用在某些实现中,用来防止在两个TCP之间的连接出现长时期的空闲。假定客户打开了到服务器的连接,传送了一些数据,然后就保持静默了。也许这个客户出故障了。在这种情况下,这个连接将永远地处于打开状态。
要解决这种问题,在大多数的实现中都是使服务器设置保活计时器。每当服务器收到客户的信息,就将计时器复位。超时通常设置为 2小时。若服务器过了 2小时还没有收到客户的信息,它就发送探测报文段。若发送了 10 个探测报文段(每一个相隔 75秒)还没有响应就假定客户出了故障,这时就终止该连接。
时间等待计时器
时间等待计时器是在连接终止期间使用的。当TCP关闭一个连接时,它并不认为这个连接马上就真正地关闭了。在时间等待期间,连接还处于一种中间过渡状态。这就可以使重复的 FIN(终止)报文段(如果有的话)可以到达目的站,从而可将其丢弃。这个计时器的值通常设置为一个报文段的寿命期待值的两倍。
产生条件:
当发送应用程序产生数据很慢,或接收应用程序读取数据(或消耗数据)很慢,或者两者都有。这时发送方和接收方都可能产生这种症状。不管是上述情况中的哪一种,都使得发送数据的报文段很小,这就引起操作效率的降低。例如,若 TCP 发送的报文段只包括一个字节的数据,则意味着我们发送41字节的数据报(20字节的TCP首部和20字节的IP 首部)才传送1字节的数据。数据的传送效率是1/41,它表示我们在非常低效率地使用网络的容量。
解决方法:
发送端产生的症状
如果发送端为产生数据很慢的应用程序服务,例如,一次产生一个字节。这个应用程序一次将一个字节的数据写入发送端的 TCP 的缓存。如果发送端的TCP 没有特定的指令,它就产生只包括一个字节数据的报文段。结果有很多41字节的IP 数据报就在互联网中传来传去。
解决的方法是防止发送端的TCP逐个字节地发送数据。必须强迫发送端的TCP收集数据然后用一个更大的数据块来发送。发送端的 TCP 要等待多长时间呢?如果等待时间过长,它就会使整个过程产生较长的时延。如果等待时间不够长,它就可能发送较小的报文段。Nagle找到了一个很好的解决方法。
Nagle算法
Nagle算法非常简单,但它能解决问题。这个算法是为发送端的 TCP用的:
(1)发送端的TCP将它从发送应用程序收到的第一块数据发送出去,哪怕只有一个字节
(2)在发送第一个报文段(即报文段 1)后,发送端的TCP 就在输出缓存中积累数据并等待:或者接收端的 TCP 发送出一个确认,或者数据已积累到可以装成一个最大的报文段,在这个时候,发送端的TCP 就可以发送这个报文段。
(3)对剩下的传输,重复步骤 2。这就是:如果收到了对报文段的确认,或者数据已积累到可以装成一个最大的报文段时,那么就发送下一个报文段(x+1)。
Nagle 算法的优点就是简单,并且它考虑到应用程序产生数据的速率,以及网络运输数据的速率。若应用程序比网络更快,则报文段就更大(最大报文段)。若应用程序比网络慢,则报文段就较小(小于最大报文段)。
接收端产生的症状
接收端的 TCP可能产生糊涂窗口综合征,如果它为消耗数据很慢的应用程序服务,例如,一次消耗一个字节。假定发送应用程序产生了 1000 字节的数据块,但接收应用程序每次只读取1字节的数据。再假定接收端的 TCP 的输入缓存为4000字节。发送端先发送第一个 4000字节的数据。接收端将它存储在其缓存中。现在缓存满了。接收端的 TCP 就通知窗口大小为零,这表示发送端必须停止发送数据。接收应用程序从接收端的 TCP的输入缓存中读取第一个字节的数据。这时在输入缓存中就有了1字节的空间。接收端的TCP 宣布其窗口大小为1字节,这表示正渴望等待发送数据的发送端的TCP 会把这个宣布当作一个好消息,并发送只包括一个字节数据的报文段。这样的过程一直继续下去。一个字节的数据被消耗掉,然后再发送只包含一个字节数据的报文段。这又是一个低效率问题和糊涂窗口综合征。
对于这种糊涂窗口综合征,即应用程序消耗数据比到达的慢,有两种建议的解决方法。
Clark 解决方法
Clark 解决方法是只要有数据到达就发送确认,但宣布的窗口大小为零,直到或者缓存空间已能放入具有最大长度的报文段,或者缓存空间的一半已经空了。
延迟的确认
第二个解决方法是延迟一段时间后再发送确认。这表示当一个报文段到达时并不立即发送确认。接收端在确认收到报文段之前一直等待,直到缓存有足够的空间为止。延迟的确认防止了发送端的TCP 滑动其窗口。当发送端的 TCP 发送完其数据后,它就停下来了。这样就防止了这种糊涂窗口综合征。
迟延的确认还有另一个优点:它减少了通信量。接收端不需要确认每一个报文段。但它也有一个缺点,就是迟延的确认有可能迫使发送端重传其未被确认的报文段。
可以用协议来平衡这个优点和缺点,例如,现在定义了确认的延迟不能超过 500 毫秒。
如果TCP在建立连接时每次都选择相同的,固定的初始序号:
(1)假定主机A和B频繁地建立连接,传送一些TCP 报文段后,再释放连接,然后又不断地建立新的连接、传送报文段和释放连接。
(2)假定每一次建立连接时,主机A都选择相同的、固定的初始序号,例如,选择1。
(3)假定主机A发送出的某些TCP 报文段在网络中会滞留较长的时间,以致造成主机A超时重传这些TCP 报文段。
(4)假定有一些在网络中滞留时间较长的TCP 报文段最后终于到达了主机 B,但这时传送该报文段的那个连接早已释放了,而在到达主机B时的TCP连接是一条新的TCP连接。
这样,工作在新的TCP连接下的主机B就有可能会接受在旧的连接传送的、已经没有意义的、过时的TCP 报文段(因为这个TCP 报文段的序号有可能正好处在现在新的连接所使用的序号范围之中),结果产生错误。
因此,必须使得迟到的 TCP 报文段的序号不处在新的连接中所使用的序号范围之中。
TCP在建立新的连接时所选择的初始序号,一定要和前面的一些连接所使用过的序号不一样。所以,不同的TCP 连接不能使用相同的初始序号。
拥塞窗口cwnd的初始值是1(为方便起见,这里将拥塞窗口的单位设为报文段)。
以后每收到一个对新的报文段的确认,就将发送端的拥塞窗口cwnd加1。拥塞窗口cwnd 按照指数规律增长。
所谓“新的报文段”就是指“未被确认过的报文段”。由于报文段在互联网中传输时,有可能在某个路由器处滞留一段时间,但以后又被交付接收端(重复交付)。接收端对每一个收到的无差错的报文段都可能给出确认。因此,对同一个报文段,发送端有可能收到几个重复的确认。但除了第一个确认可以使发送端拥塞窗口cwnd加1以外,对其余重复的报文段的确认都不能再使发送端拥塞窗口加1。
在拥塞避免的开始,发送端的拥塞窗口swnd=ssthresh,这时可以发送好几段报文段。
每经过一个往返时间RTT,拥塞窗口就增加一个MSS(最大报文段长度)的大小(以字节为单位)
发送端每收到一个对没有确认过的报文段的确认,就将发送窗口加 1。因此在陆续收到确认4~7后,将发送窗口加4,即增大到8,可以连续发送报文段8~15。
我们还可看出,接收管道(即接收端发送确认报文段的管道)在任何情况下都没有填满。这是因为确认报文段很短,只需很短的时间就可发送出去。但接收一个数据报文段需要较多的时间,这就造成确认报文段不可能连续地从接收端发送出去。
(1)每个IP数据报独立地选择路由,因此在到达目的主机时有可能出现失序。
(2)由于路由选择的计算出现错误,导致IP 数据报在互联网中兜圈子。最后数据报首部中的生存时间TTL的数值下降到零。这个数据报在中途就被丢弃了。
(3)在某个路由器突然出现很大的通信量,以致路由器来不及处理到达的数据报。因此有的数据报被丢弃。
以上列举的问题表明了,必须依靠 TCP的“可靠交付”功能才能保证在目的主机的目的进程接收到正确的报文。
RTT是TCP内部的数据,上层的应用程序无法从TCP获得RTT的数值。但应用程序可以模仿TCP的做法,即从应用层发送一个报文给对方,等收到确认后,就可算出报文的往返时间。把这个时间除以2,就得出报文从发送端到接收端所经受的时延。
可以看到B发送的四个报文段的序号都是5.因为B发送的前三个确认报文段都不消耗序号。
但如果 B在确认报文段中还带有数据,那么这种确认报文段当然要消耗序号。所消耗的序号数就是这个报文段携带的数据的字节数。
我们可以看出,即使 B 发送的前三个确认报文段都丢失了,有B 的第四个报文段(即报文段#7)的ack=301就够了,A 就知道自己所发送的数据,在序号 300 以前的(包括序号为300的),B已经都收到了。可见给确认报文段编号是没有必要的。
虽然TCP连接建立时发送的第一个SYN报文段只有首部,其数据部分是空的。但是SYN 报文段非常重要,是不允许丢失的(传错了或丢失了就要重传,否则无法建立连接),这就必须进行编号。
注:
如果A在确认报文段#3 之后接着发送数据报文段,那么这个数据报文段的序号就仍然是seq=x+1,因为确认报文段#3 是不消耗序号的。
如果A 所发送的确认报文段#3 携带了数据那么这个报文段就消耗序号例如,A所发送的确认报文段#3 携带了 100 字节的数据,那么A下一次发送的数据报文段#4的序号就应当是seq=x+101。
补充:
虽然 SYN 报文段没有数据部分,只有首部,但我们可以想象SYN 报文段包含有一个虚字节的数据,因此给SYN报文段一个序号,让SYN 报文段消耗一个序号。当对方收到序号为x的SYN 报文段后,给出的确认就应当是 ack=x+1。发送方收到这个确认,就知道发送的 SYN 报文段已正确地传送到对方了。
TCP 报文段的总长度显然有一个最小值,这就是当 TCP 的数据字段的长度为零的情况。例如,TCP 的确认报文段,仅仅有一个固定长度(20 字节)的首部,其数据字段的长度是零在这种情况下,TCP 报文段的总长度就是最小值 20 字节。这种 TCP 的首部是没有选项的首部。
TCP 报文段总长度的最大值受以下两个方面的限制:
(1)IP 数据报的总长度有一个规定的最大长度,即65535 字节。如果使用20字节的固定长度IP首部,那么TCP 报文段的总长度一定不能超过65515 字节。如果超过了这个数值必须在运输层分割报文段,使每一个TCP 报文段不超过65515 字节,否则无法封装成IP数据报。
(2)TCP 报文段数据部分的长度不能超过最大报文段长度 MSS 值。我们知道,在 TCP连接建立阶段,每一方要向对方说明自己所能接收的数据长度是多少(因为收到的数据要先存放在 TCP 的接收缓存中,如果数据太长就会放不下)。
有人说,“在 TCP 的连接建立阶段,双方要协商MSS的数值”。但这种说法是错误的(在RFC879 中专门指出这种说法是错误的因为这里不存在什么协商)。
通信的双方只是把自己的接收能力通知对方的 TCP 而已,并没有协商的过程。双方根据自己当时的具体条件给出的 MSS 值完全可以是不一样的。因此,TCP报文段的数据部分的长度肯定不能超过对方TCP给出的MSS数值。这样,我们可以得出下面的表达式:
TCP 报文段的总长度≤Min[(对方给出的MSS+TCP首部)65515字节]
这里假定了IP数据报使用20字节的固定长度IP首部。
当我们通过互联网传送很长的大文件时(例如,作为电子邮件的附件的大文件,或从某个网站下载一个大文件),一般都是使用了 TCP 协议,为的是保证在传送过程中不出现差错我们都知道,一个大文件,只要在传送过程中间有一小点差错,就会导致整个大文件无法打开,就可以导致整个文件传送失败。因此,这种大文件的传送,几乎都不使用 UDP 来传送因为UDP不能保证不出差错。接收端收到有差错的UDP 报文段时(检验和不正确),就简单地丢弃它。
但这也有例外的情况(流视频):
假设我们正在计算机上观看一个实时的流视频。这通常是个很长的文件,被分割成很多文件块并实时播送。这些文件块一个接一个地发送出去。如果运输层认为应当重传损坏或丢失的帧,那么整个传输的同步性就会丢失。观看者会突然看到一个空屏,然后需要等到第二次的传输到达。这是无法忍受的。但是,如果每一小块屏幕内容都用一个UDP 用户数据报来传送,那么接收方UDP 就能简单地忽略损坏或丢失的分组,并将其他分组交付应用程序。部分屏幕可能会有非常短暂的空白,这对大多数观看者来说甚至都不会注意到。这就说明,在一些特殊情况下,不保证可靠传输的UDP协议也是很有用的。
互联网:允许一个程序向另一个程序发出呼叫请求(即主动发出要求通信的请求)。
不同之处:
电信网:两个电话机都处于不通话状态时(即都处于挂机状态时),主叫方摘机并拨号进行呼叫,被叫方听到铃响并摘机后,双方开始进行通话。也就是说,主叫方通过自己的振铃可以使被叫方的电话机变为通话状态(当然要通过被叫人的摘机动作)。
互联网:当被叫程序处于运行状态时,主叫程序发出通信请求,被叫程序同意进行通信后,双方程序开始进行通信。但如果被叫程序没有处在运行状态,则主叫程序无法使被叫程序变为运行状态。在这种情况下,双方的通信是不可能的。因此,计算机程序之间的通信的一个很重要的特点就是:被叫程序必须始终处于运行状态。通常将主叫程序称为客户程序,而被叫程序称为服务器程序。
(1)应用层协议。HTTP 是一个应用层协议。HTTP 使用可靠的面向连接的运输协议TCP但HTTP协议本身并不提供可靠性机制和重传机制。
(2)请求/响应。一旦建立了运输连接(这常常称为建立了会话),浏览器端就向万维网服务器端发送HTTP请求,服务器收到请求后给出HTTP响应。
(3)无状态。“无状态”(stateless)就是指每一个HTTP 请求都是独立的。万维网服务器不保存过去的请求和过去的会话记录。这就是说,同一个用户再次访问同一个服务器时,只要服务器没有进行内容的更新,服务器的响应就给出和以前被访问时相同的响应。服务器不记录曾经访问过的用户,也不记录某个用户访问过多少次。
(4)双向传输。这在大多数情况下都是这样的:浏览器发出HTTP 请求,服务器给出HTTP响应。
(5)能力协商。HTTP允许浏览器和服务器协商一些细节,如在传送数据时使用的字符集发送端可指明它所能够提供的能力(capability),而接收端也能够指明它所能够接受的能力。
(6)支持高速缓存。为了缩短响应时间,浏览器可将读取的万维网页面暂存在其高速缓存中。如果用户再次请求该页面,则 HTTP 允许浏览器可以对服务器进行查询,以便确定自从上次缓存了该页面后页面的内容是否有变化。
(7)支持代理服务器。HTTP 允许在浏览器和服务器之间存在一个代理服务器。代理服务器将万维网页面存放在自己的缓存中,并且从这缓存中取出页面回答浏览器的请求。
补充:
HTTP1.1的最主要的变化就是改变了HTTP1.0的“无状态”这一特点。我们知道,当用户访问某个网站时,假定该网页上有一个文本文件和 15 个图形文件,那么用户要和这个万维网服务器建立总共 16 次的TCP 连接,才能将这16个文件全部下载完。浏览器在和服务器建立好一个TCP连接后,就发送HTTP请求,然后得到服务器的HTTP响应,传送过来一个文件(文字的或图形的),然后就自动断开 TCP 连接了。当点击下一个链接时,又重复以上的步骤。
HTTP1.1将HTTP1.0的“无状态”这个特点改变了。HTTP1.1采用持续连接(persistentconnection)作为默认的工作方式。当浏览器和某一万维网服务器建立TCP 连接后,就可以在同一个TCP连接上,传送多次的 HTTP 请求和HTTP 响应。当浏览器或服务器要关闭 TCP连接时,就通知对方,然后再关闭连接。
持续连接最大的好处就是减小了开销。减小了建立 TCP 连接的次数,就减小了服务器的负担,缩短了响应时间,同时也减小了下层网络的开销,减少了缓存所占用的存储空间,也减少了使用的CPU时间。使用持续连接的浏览器还可以进一步优化对网站的访问。这就是采用流水线式的请求,即可以连续地发送请求,而不需要在收到响应后才发送下一-个请求。当需要在某个页面读取多个图像文件而下层互连网络的吞吐量和时延都很大时,采用流水线式的请求就格外显得优点突出。
使用持续连接是要付出代价的。在建立TCP 连接后,不论是浏览器还是服务器都不知道这个特定的 TCP连接将要持续多长时间。这对服务器来说是个很主要的问题,因为可能有几千个浏览器要和这个服务器建立连接。我们应当注意到,只有连接的双方都关闭连接,TCP连接才会完全关闭。服务器端应当设置一个超时计时器,以便当一定时间内没有收到请求就可关闭这个连接。客户端和服务器端都必须注意对方是否关闭了 TCP连接。若发现对方关闭了连接,那么自己这一端也应当随即关闭这个TCP连接。
拒绝服务DOS
拒绝服务DOS可以由以下几种方式产生(往往使用虚假的IP 地址):
(1)向一个特定服务器非常快地发送大量任意的分组,使得该服务器过负荷,从而无法正常工作。
(2)向一个特定服务器发送大量的TCP SYN 报文段(即建立TCP 连接的三报文握手中的第一个报文段)。服务器还误以为是正常的互联网用户的请求,于是就响应这个请求,并分配了数据结构和状态。但攻击者不再发送后面的报文段,因而永远不能够完成 TCP 连接的建立。这样可以浪费和耗尽服务器的大量资源。这种攻击方式又称为 SYN flooding(意思是使用同步标志进行洪泛)。
(3)重复地和一个特定服务器建立 TCP 连接,然后发送大量无用的报文段。
(4)将IP 数据报分片后向特定服务器发送,但留一些数据报片不发送。这就使得目的主机永远无法组装成完整的数据报,一直等待着,浪费了资源。
(5)向许多网络发送ICMP 回送请求报文(就是使用应用层的 PING程序),结果使许多主机都向攻击者返回ICMP 回送回答报文。无用的、过量的ICMP 报文使网络的通信量急剧增加,甚至使网络瘫痪。这种攻击方式被称为Smurf攻击。Smurf就是能够对网络自动发送这种ICMP报文攻击的程序名字。
分布式拒绝服务DDOS
分布式拒绝服务DDOS的特点,就是攻击者先设法得到互联网上的大量主机的用户账号,然后攻击者设法秘密地在这些主机上安装从属程序(slave program)。
当攻击者发起攻击时,所有从属程序在攻击者的主程序(master program)的控制下,在同一时刻向被攻击主机发起拒绝服务攻击 DOS。这种经过协调的攻击具有很大的破坏性,可以使被攻击的主机迅速瘫痪。
在2000年2月美国的一些著名网站(如eBay,Yahoo和CNN等)就遭受到了这种分布式拒绝服务的攻击。
拒绝服务和分布式拒绝服务都是很难防止的。使用分组过滤器并不能阻止这种攻击,因为攻击者的IP 地址是事先不知道的。当主机收到许多攻击的数据报时,很难区分开哪些是好的数据报,而哪些是坏的数据报。例如,当服务器收到请求建立 TCP 连接的SYN 报文时很难区分这是真的请求建立 TCP 连接,还是恶意消耗服务器资源的连接请求。当攻击者使用IP地址欺骗时,要确定攻击者真正的IP地址也是很难的。
本来“分组”就是网络层的协议数据单元名称。防火墙中使用的分组过滤器就是安装在路由器中的一种软件。大家知道,路由器工作在网络层。从这个意义上讲,分组过滤器当然也应当是工作在网络层。分组过滤器根据所设置的规则和进入路由器的分组的IP 地址(源地址或目的地址),决定对该分组是否进行阻拦。这样的分组过滤器当然是工作在网络层。
但是,为了增强分组过滤器的功能,一些分组过滤器不仅检查分组首部中的IP 地址,而且进一步检查分组的数据内容,也就是说,检查运输层协议数据单元的首部。这主要是检查端口号。这样做的目的是可以进一步限制所通过的分组的服务类型。
例如,阻拦所有从本单位发送出去的、向计算机 192.50.2.18 请求FTP服务的分组。由于FTP 的熟知端口号是21,因此只要在分组过滤器的阻拦规则中写上“禁止到目的地址为 192.50.2.18 且目的端口号为21的所有分组”即可。
因此,这样的分组过滤器不仅工作在网络层,而且还工作在运输层。从严格的意义上讲,这样的路由器已经不是仅仅单纯工作在网络层了。
当然,像上面给出的规则,也可以由应用网关(即代理服务器)来实现。
SSID(Service Set IDentifier)就是IEEE 802.11无线局域网中的服务集标识符。由于服务集常常扩大为扩展的服务集 ESS,因此SSID也常记为 ESSID。
SSID 用来区分无线局域网中的不同网络,最多可以有 32个字符,无线网卡设置了不同的SSID就可以进入不同的网络,SSID 通常由AP广播出来,个人计算机通过 Windows 自带的扫描功能可以查看当前区域内的SSID。SSID就是一个局域网的名称。
如果用户使用的操作系统是微软公司的 Windows XP可以用鼠标左键点击“开始”-“设置”-“网络连接”,就可找到“无线网络连接”的图标,点击后就可看见你周围的一些无线局域网的名字,也就是这些网络的 SSID。如果这个无线局域网是对公众免费开放的(例如,在一些机场的候机室内或一些快餐店内),那么点击这个无线局域网的名字就能够进入这个网络,从而连接到互联网上。但如果遇到非免费的无线局域网,下一步就必须输入密码,待验证通过后方能接入。
释疑与习题学习笔记,学习内容持续更新中~~