计算机网络学习

物理层

1.物理层要解决什么问题、主要特点是什么?

物理层的主要任务是确定与传输媒体的接口有关的一些特性,包括:机械特性、电气特性、功能特性和过程特性。

2.一些术语:

  • 消息
    如语音、文字、图像、视频。
  • 数据
    运送消息的实体,通常是有意义的符号序列。
  • 信号
    数据的电气或者电磁的表现。信号分为两类:模拟信号(或称连续信号,取值是连续的),数字信号(或称离散信号,如0和1)

3.信道

信道用来表示向某一个方向传送信息的媒体。信道分为三种基本方式:

  • 单向通信(单工通信)–类比单向车道
  • 双向交替通信(半双工通信)–类比潮汐车道,某一时间只能朝一个方向
  • 双向同时通信(全双工通信)–类比双向车道

基带信号(信息源,也称发终端)指发出的没有经过调制(进行频谱搬移和变换)的原始电信号,其特点是频率较低,信号频谱从零频附近开始,具有低通形式。许多信道不能传输,为了解决这种问题必须对基带信号进行调制

调制分为两类:
基带调制–对基带信号的波形进行变换,使之与信道的特性相适应,变换后的信号仍然是基带信号。基带调制也称为编码。常用的基带调制方式:
在这里插入图片描述

带通调制–把基带信号搬移到较高的频段,并转换为模拟信号。常用的带通调制方式

在这里插入图片描述

4.信道复用技术

信道复用包括频分复用、时分复用、统计时分复用、波分复用

频分复用是按频率分割多路信号的方法,即将信道的可用频带分成若干互不交叠的频段,每路信号占据其中的一个频段。在接收端用适当的滤波器将多路信号分开,分别进行解调和终端处理。

时分复用将传输时间划分为多个等长的时间段,所有用户在不同的时间占用同样的频带宽度(分时不分频)。

波分复用就是光的频分复用。

码分复用
用户使用经过特殊挑选的不同码型,在同样的时间使用同样的频带进行通信,但彼此不会造成干扰。这种系统发送的信号有很强的抗干扰能力,其频谱类似于白噪声,不易被敌人发现。

码分复用更常用的名词是码分多址(CDMA),在CDMA中,每一个比特时间划分为 m 个短的间隔,称为码片(chip)。通常m的值是64或者128。使用CDMA的每一个站点被分配一个唯一的mbit的码片序列,如果一个站点要发送比特1,则它发送自己的码片序列,发送0则发送码片的反码。CDMA系统的一个重要特点是给每一个站点发送的码片序列不同,并且必须相互正交。正交是指两个序列的内积是0:
在这里插入图片描述
例题:
共有4个站进行码分多址通信。4个站的码片序列为
A:(-1-1-1+1+1-1+1+1) B:(-1-1+1-1+1+1+1-1)
C:(-1+1-1+1+1+1-1-1) D:(-1+1-1-1-1-1+1-1)
现收到这样的码片序列S:(-1+1-3+1-1-3+1+1)。问哪个站发送数据了?发送数据的站发送的是0还是1?

答:
S·A= (+1-1+3+1-1+3+1+1)/8=1, A发送1

S·B= (+1-1-3-1-1-3+1-1)/8=-1, B发送0

S·C= (+1+1+3+1-1-3-1-1)/8=0, C没有发送

S·D= (+1+1+3-1+1+3+1-1)/8=1, D发送1

数据链路层

数据链路层的作用:

数据链路层的主要功能是传输数据帧,将源计算机网络层下来的数据可靠的传输到相邻节点的目标计算机的网络层。

数据链路层的三个基本问题:

  • 封装成帧
    封装成帧就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。帧是数据链路层的数据传输单元。
    在这里插入图片描述
    每一种链路层协议都规定了帧的数据部分的长度上限——最大传送单元MTU(Maximum Transfer Unit)。
    在这里插入图片描述控制字符SOH(Start Of Header)放在一帧的最前面,表示帧的首部开始。另一个控制字符EOT(End Of Transmission)表示帧的结束。

  • 透明传输

“透明”表示某一个实际存在的事物看起来好像不存在一样。
当传送的帧使用文本文件组成的帧时(文本文件中的字符都是从键盘上输入的),其数据部分显然不会出现像SOH或EOT这样的帧定界控制字符。可见不管从键盘上输入什么字符都可以放在这样的帧中传输过去,因此这样的传输就是透明传输。

当数据部分是非ASCII码的文本文件时(如二进制代码的计算机程序或图像等),,如果数据中的某个字符的二进制代码恰好和SOH或EOT这种控制字符一样,数据链路层就会错误地找到帧的边界,把部分帧收下(误认为是完整的帧),而把剩下的那部分数据丢弃(这部分找不到帧定界控制字符SOH)。这样的帧的传输显然就不是透明传输。
在这里插入图片描述
为了解决透明传输的问题,就必须设法使数据中可能出现的控制字符”SOH”和”EOT”在接收端不被解析为控制字符。发送端的数据链路层在数据中出现控制字符”SOH”和”EOT”的前面插入一个转义字符”ESC”(其十六进制编码是1B)。而在接收端的数据链路层在将数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充(byte stuffing)或字符填充(character stuffing)。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。

在这里插入图片描述
也就是说,“ESC”字符的加加减减只在数据链路层中实现,出到其它层之后就好像什么都无发生过,所以叫透明传输。

  • 差错检测

传输差错:可分为两大类,一类就是最基本的比特差错(就是比特在传输过程中可能会产生差错,即1可能会变成0,0可能会变成1),另一类就是收到的帧并没有出现比特错误,但却出现了帧丢失、帧重复或帧失序。
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种检测措施。解决方法:目前在数据链路层广泛使用了循环冗余检验CRC检测技术。在数据链路层使用CRC检验,能够实现无比特差错的传输,但不能保证可靠传输。

适配器

计算机通过通信适配器与外界局域网连接,又称为网卡。适配器包含了网络层和数据链路层的功能。
在这里插入图片描述

MAC层

为了使数据链路层能更好地适应多种局域网标准,IEEE 802 委员会就将局域网的数据链路层拆成两个子层:

逻辑链路控制 LLC (Logical Link Control)子层;
媒体接入控制 MAC (Medium Access Control)子层。
在这里插入图片描述
由于 TCP/IP 体系经常使用的局域网是 DIX Ethernet V2 而不是 802.3 标准中的几种局域网,因此现在 802 委员会制定的逻辑链路控制子层 LLC(即 802.2 标准)的作用已经不大了。很多厂商生产的适配器上就仅装有 MAC 协议而没有 LLC 协议。

MAC地址:
在局域网中,硬件地址又称为物理地址,或 MAC 地址。IEEE 802 标准规定 MAC 地址字段采用 6 字节 ( 48位) 。IEEE 的注册管理机构 RA 负责向厂家分配地址字段 6 个字节中的前三个字节 (即高位 24 位),称为组织唯一标识符。
地址字段 6 个字节中的后三个字节 (即低位 24 位) 由厂家自行指派,称为扩展唯一标识符,必须保证生产出的适配器没有重复地址

在这里插入图片描述
适配器检查 MAC 地址

适配器从网络上每收到一个 MAC 帧就首先用硬件检查 MAC 帧中的 MAC 地址。

如果是发往本站的帧则收下,然后再进行其他的处理。

否则就将此帧丢弃,不再进行其他的处理。

“发往本站的帧”包括以下三种帧:

单播 (unicast) 帧(一对一)
广播 (broadcast) 帧(一对全体)
多播 (multicast) 帧(一对多)
所有的适配器都至少能够识别前两种帧,即能够识别单播地址和广播地址。

MAC帧

在这里插入图片描述
类型字段用来标志上一层使用的是什么协议,以便把收到的 MAC 帧的数据上交给上一层的这个协议。

64字节<MAC帧的长度<1516字节

当IP数据报的长度小于 46 字节时,应在数据字段的后面加入整数字节的填充字段,以保证以太网的 MAC 帧长不小于 64 字节。 IP数据报中包含数据长度的字段,例如当IP数据报的长度为42字节时,填充4字节。当MAC帧把46字节数据交给上层IP层后,IP层就把最后的4字节丢弃。

在帧的前面插入(硬件生成)的 8 字节中,第一个字段共 7 个字节,是前同步码,用来迅速实现 MAC 帧的比特同步。第二个字段 1 个字节是帧开始定界符,表示后面的信息就是 MAC 帧。

无效的 MAC 帧
数据字段的长度与长度字段的值不一致;
帧的长度不是整数个字节;
用收到的帧检验序列 FCS(使用CRC检验) 查出有差错;
数据字段的长度不在 46 ~ 1500 字节之间。
有效的 MAC 帧长度为 64 ~ 1518 字节之间。

CSMA/CD协议(多点接入载波监听/冲突检测)

多点接入说明是总线型网络,计算机以多点接入的方式连接在一根总线上,协议的实质是“载波监听”和“碰撞检测”。

载波监听就是利用电子技术检测总线上有没有其他计算机也在发送。载波监听实际上就是检测信道。在发送前,每个站不停地检测信道,是为了获得发送权;在发送中检测信道,是为了及时发现有没有其他站的发送和本站发送的碰撞,这就是碰撞检测。总之,载波监听是全程都在进行的。

碰撞检测就是边发送边监听。就是网卡边发送数据边检测新岛上的信号电压的变化情况,以便判断自己在发送数据的时候其他站是否也在发送数据。当几个站同时在总线上发送数据时,总线上的信号电压变化幅度将会增大(互相叠加),当网卡检测到的信号电压超过一定的门限值时,说明总线上至少有两个站同时在发送数据,表明产生了碰撞(冲突),所以也称为冲突检测。这时,由于接收的信号已经识别不出来,所以任何一个正在发送的站就会立即停止发送数据,然后等待一段随机事件以后再次发送。
简单总结为:先听后发,边发边听,冲突停发,随机延迟后重发

网络层

与网络互相连接需要使用一些中间设备

(1)物理层使用的中间设备叫做转发器
(2)数据链路层使用的中间设备叫做交换机
(3)网络层使用的中间设备叫做路由器
(4)在网络层以上使用的中间设备叫做网关

网际协议IP

网际协议 IP 是TCP/IP 体系中两个最主要的协议之一。与 IP 协议配套使用的还有三个协议:

地址解析协议 ARP
网际控制报文协议 ICMP
网际组管理协议 IGMP

它们之间的关系如下:
在这里插入图片描述

IP地址分类

将 IP 地址划分为若干个固定类(A、B、C类),这三类地址都由两个固定长度的字段组成,其中第一个字段是网络号,标志主机所连接的网络。第二个字段是主机号,标志该主机。
在这里插入图片描述
在这里插入图片描述
IP地址和硬件地址关系
在这里插入图片描述

地址解析协议 ARP

ARP 实现由 IP 地址得到 MAC 地址
在这里插入图片描述
地址解析协议:当知道一个主机的 IP 地址,通过地址解析协议 ARP 来找出相应的硬件地址。

地址解析协议 ARP 作用:在主机 ARP 高速缓存中存放一个从 IP 地址到硬件地址的映射表,并且这个映射表经常动态更新。每一台主机都设有一个 ARP 高速缓存(ARP Cache),里面有本局域网上的各主机和路由器的 IP 地址到硬件地址的映射表(并且每一个映射地址都设置有生存时间)。

使用 ARP 的四种典型情况:

在这里插入图片描述

(1)发送方是主机(如H1),要把 IP 数据报发送到同一个网络上的另一台主机(如H2)。这时H1先查看自身 ARP 缓存表是否有 H2 硬件地址,有的话则直接发送。若没有则发送 ARP 请求分组(在网1上广播),找到目的主机 H2 的硬件地址。
(2)发送方是主机(如H1),要把 IP 数据报发送到另一个网络上的一台主机(如H3或H4)。这时发送 ARP 请求分组(在网1上广播),找到网1上的一个路由器 R1 的硬件地址。剩下的工作由路由器 R1 来完成。R1 要做的事情是下面的(3)或(4)。
(3)发送方是路由器(如R1),要把 IP 数据报转发到与 R1 连接在同一个网络(网2)上的主机(如H3)。这时 R1 发送 ARP 请求分组(在网2上广播),找到目的主机 H3 的硬件地址。
(4)发送方是路由器(如R1),要把 IP 数据报转发到网3上的一台主机(如H4)。H4与 R1 不是连接在同一个网络上。这时 R1 发送 ARP 请求分组(在网2上广播),找到连接在网 2 上的一个路由器 R2 的硬件地址。剩下的工作由这个路由器 R2来完成

IP数据报

在这里插入图片描述
版本:占4位,指IP协议的版本.通信双方使用的IP协议版本必须一致.日前广泛使用的 IP协议版本号为 4 (即 IPv4).IPv6 目前还处于起步阶段.

首部长度:占 4 位,可表示的最大十进制数值是15.请注意,这个字段所表示数的单位是32位字 (1个32位字长是4 字节),因此,当 IP 的首部长度为 1111 时 (即十进制的 15),首部长度就达到 60字节.当 IP 分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充.因此数据部分永远在 4字节的整数倍开始,这样在实现 IP协议时较为方便.首部长度限制为 60字节的缺点是有时可能不够用.这样做的目的是希望用户尽量减少开销.最常用的首部长度就是 20 字节 (即首部长度为 0101),这时不使用任何选项.

服务:占 8 位,用来获得更好的服务.这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过.1998年IETF把这个字段改名为区分服务 DS(Differentiated Services).只有在使用区分服务时,这个字段才起作用.

总长度:总长度指首都及数据之和的长度,单位为字节.因为总长度字段为 16位,所以数据报的最大长度为 216-1=65 535字节.在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,即最大传送单元 MTU (Maximum Transfer Unit).当一个数据报封装成链路层的帧时,此数据报的总长度 (即首部加上数据部分)一定不能超过下面的数据链路层的MTU值,否则要分片.

标识 (Identification):占 16位.IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段.但这个"标识"并不是序号,因为 IP是无连接的服务,数据报不存在按序接收的问题.当数据报由于长度超过网络的 MTU 而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中.相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报.

标志 (Flag):占3 位,但目前只有2位有意义. 标志字段中的最低位记为 MF(More Fragment).MF=1即表示后面"还有分片"的数据报.MF=0表示这已是若干数据报片中的最后一个.标志字段中间的一位记为DF(Don’t Fragment),意思是"不能分片",只有当 DF=0时才允许分片.

片偏移:占 13位.较长的分组在分片后,某片在原分组中的相对位置.也就是说,相对用户数据字段的起点,该片从何处开始.片偏移以 8个字节为偏移单位,这就是说,每个分片的长度一定是 8字节(64位)的整数倍.

生存时间:占 8位,生存时间字段常用的英文缩写是TTL(Time To Live),其表明数据报在网络中的寿命.由发出数据报的源点设置这个字段.其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源.最初的设计是以秒作为 TTL的单位.每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间.若数据报在路由器消耗的时间小于 1 秒,就把TTL值减 1.当 TTL值为 0时,就丢弃这个数据报.

协议:占 8 位.协议字段指出此数据报携带的数据是使用何种协议,是TCP还是UDP,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程.

首部检验和:占 16位.这个字段只检验数据报的首部,但不包括数据部分.这是因为数据报每经过一个路由器,都要重新计算一下首都检验和 (一些字段,如生存时间,标志,片偏移等都可能发生变化),不检验数据部分可减少计算的工作量.

源地址:占32位.

目的地址:占 32位.

ICMP 网际控制报文

为了提高 IP 数据报交付成功的机会,在网络层使用了网际控制报文协议来允许主机或路由器报告差错和异常情况。ICMP 报文作为网际层数据报的数据,加上数据报的首部,组成 IP 数据报发出去。ICMP 协议是网际层协议。
ICMP 报文的种类有两种,即 ICMP 差错报告报文ICMP 询问报文

ICMP 差错报告报文用于目标主机或到目标主机路径上的路由器向源主机报告差错和异常情况。

ICMP 询问报文有四种类型:回送请求和回答报文、时间戳请求和回答报文、掩码地址请求和回答报文、路由器询问和通告报文,最常用的是前两类。
ICMP 的两个常见的应用是分组网间探测 PING 和 traceroute。其中 PING 使用了 ICMP 回送请求和回答报文。PING工作在应用层,它直接使用网络层的ICMP协议,而没有使用传输层的TCP或UDP协议。
在这里插入图片描述

VPN和NAT

如果一个机构由分散的多个网点构成,为了保证通信的私密性,可以采用“租用专线”的方法实现各网点之间的通信,但这种方式成本较高,因此更多的是采用VPN协议。

虚拟专用网络VPN
利用公共网络(如 Internet)来构建的专用网络技术,保证了VPN中任何两台计算机之间的通信对外界是隐藏的。

VPN工作原理
VPN的实现主要使用了两种基本技术:隧道传输 和 加密技术

  • VPN定义了两个内部网络的路由器之间通过Internet建立的通信隧道,使用IP-in-IP封装后在隧道中转发数据报
  • 为了保证保密性,隧道发送路由器把内网IP数据报加密后,封装为外网IP数据报的数据部分在外网中进行传输
  • 隧道接收路由器收到数据报后,从外网数据报中取出数据部分,将数据报解密,还原成内网数据报,然后转发该数据报
    在这里插入图片描述
    X的内网IP数据报到达边缘路由器R1后,R1将内网IP数据报进行加密,然后重新封装为外网IP数据报,此时的源IP为125.1.2.3、目的IP为194.4.5.6,外网IP数据报到达R2后,R2从中取出数据部分并进行解密,还原出内网IP数据报,然后将其发送给Y。

网络地址转换协议NAT
网络地址转换 NAT (Network Address Translation)就是用来解决本地编址的内部网络与外网通信的问题:

  • 需要在内网与外网的边缘路由器上安装 NAT 软件,装有 NAT 软件的路由器叫做 NAT路由器,它至少有一个有效的外部全球地址。
  • 所有使用本地地址的主机在和外界通信时都要在 NAT 路由器上将其本地地址转换成 外部全球地址才能和因特网连接。

NAT的工作原理原理即进行数据包的地址转换
在这里插入图片描述
VPN与NAT的区别
可以发现VPN协议和NAT协议都是通过重新构建一个IP首部来实现的,但他们的实现又有区别,VPN是将内部IP数据报加密后打包成外部IP数据报的数据部分,它的主要目的是为了数据的保密性,而NAT是纯进行地址转换,它的目的是为了解决本地编址的内部网络与外网通信的问题。

传输层

传输层主要是为相互通信的应用进程提供逻辑通信,即使在不可靠的网络层(主机之间的逻辑通信)传输下,传输层也能提供可靠的传输。(所谓的逻辑通信就是指:传输层之间看似是在水平方向传送数据,但是事实上这两个传输层之间并没有水平方向上的物理连接)

传输层有两种不同的传输协议:面向连接的TCP(传输控制协议),面向无连接的UDP(用户数据报协议)。

传输层的服务基本原理

复用和分用技术

复用:发送方的不同的应用进程都可以使用同一个传输层协议传送数据;

分用:接收方的传输层剥去报文首部之后能把这些数据正确的传输到正确的应用进程上。

用户数据报协议UDP

UDP在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测。
UDP特点

  • UDP 是无连接的,即发送数据之前不需要建立连接(发送数据结束时也没有连接可释放),减少了开销和发送数据之前的时延。
  • UDP 使用尽最大努力交付,即不保证可靠交付。
  • UDP 是面向报文的,发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP一次交付一个完整的报文。
  • UDP没有拥塞控制,网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。
  • UDP 支持一对一、一对多、多对一和多对多的交互通信
  • UDP 的首部开销小,只有8个字节,比 TCP 的20个字节的首部要短

UDP首部格式

UDP数据报分为首部和用户数据部分,整个UDP数据报作为IP数据报的数据部分封装在IP数据报中,UDP数据报文结构如图所示:
在这里插入图片描述
源端口: 源端口号,需要对方回信时选用,不需要时全部置0.
目的端口:目的端口号,在终点交付报文的时候需要用到。
长度:UDP的数据报的长度(包括首部和数据)其最小值为8(只有首部)
校验和:检测UDP数据报在传输中是否有错,有错则丢弃

传输控制协议 TCP

TCP协议的特点:

  • TCP是面向连接的传输层协议,在使用TCP协议之前必须先建立TCP连接,传输完数据之后必须释放已经建立的TCP连接。
  • 点对点的连接,每一条TCP连接有两个端点
  • TCP提供可靠的交付,通过TCP连接发送的数据,无差错、不丢失、不重复、按序到达
  • TCP提供全双工通信
  • TCP是面向字节流的

TCP连接的端点叫套接字

套接字

我们知道在网络中通过Ip来唯一标识一个主机。而通过端口号来标识一台主机中的不同应用进程。所以在网络连接中就出现了Socket套接字来标识一个主机上的某进程。其实际是一个通信端点。

套接字(Socket) = (Host IP , port)

端口号就是用来标识应用进程的数字标识。其端口号的长度为16Bit;也就是能够标识216个不同的端口号。

TCP报文段首部

在这里插入图片描述

  • 源端口和目的端口 : 各占2个字节,分别写入源端口和目的端口。

  • 序号 : 占4字节。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号是301,而接待的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。这个字段的序号也叫“报文段序号”。

  • 确认号 占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。

  • 数据偏移:占4位,这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的,但应注意,“数据偏移”的单位是32位字(即以4字节的字为计算单位)。由于4位二进制数能表示的最大十进制数字是15,因此数据偏移的最大值是60字节,即首部长度最大60字节。

  • 保留 : 占6位,保留为今后使用,但目前应置为0 。

标志位

  • 紧急URG:当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间。
    当URG置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。

  • 确认ACK: 仅当ACK = 1时确认号字段才有效,当ACK = 0时确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1。

  • 推送 PSH: 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。

  • 复位RST: 当RST=1时,表名TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。

  • 同步SYN: 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个连接请求或连接接受报文。

  • 终止FIN: 用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。

  • 窗口 :占2字节。窗口值是【0,216-1】之间的整数。窗口指的是发送本报文段的一方的接受窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化

  • 检验和: 占2字节。检验和字段检验的范围包括首部和数据这两部分。

  • 紧急指针 :占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。

  • 选项 : 长度可变,最长可达4字节。当没有使用“选项”时,TCP的首部长度是20字节

TCP可靠传输的实现:

建立连接(三次握手)

TCP是面向连接的,在发送数据之前首先要建立TCP连接,这个建立连接的过程客户端和发送端一共要发送三次TCP报文,要做的事情包括指定端口、同步连接双方的序列号和确认号、交换TCP窗口大小信息,这个过程被成为三次握手。

在这里插入图片描述
(1)最初客户端和服务端进程都处于CLOSED(关闭)状态。客户端主动打开连接,服务端被动打开连接。
(2)服务端进程创建传输控制模块TCB,进入LISTEN(收听)状态,准备接收客户端的连接请求。
握手开始
(3)客户端进程也创建传输控制模块,然后向服务端发出请求连接的报文段。同部位SYN=1,ACK=0,假设初始序列号seq=x。客户端进入SYN-SENT(同步已发送)状态。
(4)服务端收到请求后,如果同意建立连接,则向客户端发送确认。确认报文中SYN同步位=1,和ACK=1,确认号ack=x+1,序列号seq=y。服务端进程进入SYN-RCVD(同步收到)状态。
(5)客户端 进程收到服务端的确认后,要对确认进行确认。向服务端发确认,确认报文段的ACK=1,确认号ack=y+1,seq=x+1这时客户端进入ESTABLISHED(已建立连接)状态。服务端收到客户端的确认后也进入ESTABLISHED状态。

为什么要三次握手: 为什么客户端收到确认后还要再发送一次确认?
主要是为了防止已失效的连接请求报文又突然传送到服务端,因而产生错误。

假设一种情况,客户端发送一次连接请求后,未收到确认,于是又重新发送一次并建立了连接。然而第一次发送的请求并没有丢失,而是因为在某些节点滞留了很长时间到达服务端,本来是一个早已失效的报文段,但服务端收到报文后误以为是客户端又发送了一次请求,于是向客户端发送确认报文,如果没有三次握手机制,新的连接就建立了,并一直等待客户端发送数据造成资源浪费。

由于三次握手机制,客户端收到服务端的确认报文后,不会再向服务端发送确认确认的报文段,由于服务端没有收到确认,连接就没有建立。

如果第三次握手丢失了,客户端服务端会如何处理?

如果第三次握手在网络中丢失,那么服务端会依次等待3秒、6秒、12秒后重新发送确认报文,以便客户端重新发送ACK包。

如果重发指定次数后,仍然未收到ACK应答,那么一段时间后,服务端自动关闭这个连接。

但是客户端认为这个连接已经建立,如果客户端向服务端写数据,服务端将以RST包(RST置为1)响应,请求终止连接,这时客户端才能感知到服务端的错误。

发送数据

TCP的可靠传输机制的实质是用字节序号进行控制。

确认机制

ARQ协议,即自动重传请求。它通过使用确认超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,它通常会重新发送。ARQ包括停止等待ARQ协议和连续ARQ协议。

为了实现可靠传输的,它的基本原理就是每发完一个分组就- 停止发送,等待对方确认。在收到确认后再发下一个分组。 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

对每一个分组进行应答确认效率太差,为了解决这个问题TCP引入窗口概念,确认应答不再是以每个分组而是更大的单位,窗口的大小就是无需等待确认继而可以继续发送数据的最大值。

滑动窗口
滑动窗口协议在在发送方和接收方之间各自维持一个滑动窗口,发送发是发送窗口,接收方是接收窗口,而且这个窗口是随着时间变化可以向前滑动的。它允许发送方发送多个分组而不需等待确认。TCP的滑动窗口是以字节为单位的。

发送窗口中有四个概念:

  • 已发送并收到确认的数据(不在发送窗口和发送缓冲区之内)
  • 已发送但未收到确认的数据(位于发送窗口之内)
  • 允许发送但尚未发送的数据(位于发送窗口之内)
  • 发送窗口之外的缓冲区内暂时不允许发送的数据

接收窗口中的四个概念:

  • 已发送确认并交付主机的数据(不在接收窗口和接收缓冲区之内)
  • 未按序收到的数据(位于接收窗口之内)
  • 允许的数据(位于接收窗口之内)
  • 不允许接收的数据(位于发送窗口之内)

在这里插入图片描述
规则:
(1)凡是已经发送过的数据,在未收到确认之前,都必须暂时保留,以便在超时重传时使用。

(2)只有当发送方A收到了接收方的确认报文段时,发送方窗口才可以向前滑动几个序号。

(3)当发送方A发送的数据经过一段时间没有收到确认(由超时计时器控制),就要使用回退N步协议,回到最后接收到确认号的地方,重新发送这部分数据。

流量控制

流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收,TCP提供的机制可以让发送方根据接收方的实际接收能力控制发送的数量。
具体的操作就是接收方主机向发送方主机通知自己可以接收数据的大小。TCP首部中专门有一个字段用来记录·窗口大小。
在这里插入图片描述
考虑一种特殊的情况,就是接收方若没有缓存足够使用,就会发送零窗口大小的报文,此时发送放将发送窗口设置为0,停止发送数据。之后接收方有足够的缓存,发送了非零窗口大小的报文,但是这个报文在中途丢失的,那么发送方的发送窗口就一直为零导致死锁。为了解决这个问题,TCP为每一个连接设置一个持续计时器。只要TCP的一方收到对方的零窗口通知,就启动该计时器,周期性的发送一个零窗口探测报文段。对方就在确认这个报文的时候给出现在的窗口大小(注意:TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段)

拥塞控制
在这里插入图片描述

若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做拥塞
当网络的吞吐量明显的小于理想的吞吐量时,网络就进入了轻度拥塞状态。当提供的负载达到某一数值时,网络的吞吐量反而随提供的负载的增大而下降,这时网络就进入了拥塞状态

拥塞控制的四种算法:

慢开始在这里插入图片描述
最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。具体来说,当新建连接时,cwnd初始化为1个最大报文段(MSS)大小,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认,cwnd就增加1个MSS大小。这样cwnd的值就随着网络往返时间(Round Trip Time,RTT)呈指数级增长。当前的拥塞窗口cwnd的值已经等于慢开始门限值ssthresh,之后改用拥塞避免算法

拥塞避免
在这里插入图片描述
当发送方没有按时收到应当到达的确认报文后,就可能发生了拥塞。
避免拥塞算法包括:

  • 当拥塞窗口增加到慢开始门限ssthresh时,慢开始算法就改为拥塞控制算法,拥塞窗口的大小按照线性规律增长。
  • 发生拥塞状态时,更新ssthresh的值为原来的一半,拥塞窗口的值设置成1,并执行慢开始算法。达到新的慢门限值时,改为执行拥塞避免算法。

乘法减小“是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值 ssthresh 设置为当前的拥塞窗口值乘以 0.5。当网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入到网络中的分组数。
加法增大”是指执行拥塞避免算法后,当收到对所有报文段的确认就将拥塞窗口 cwnd增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。

快重传
快重传算法要求接收方每收到一个失序报文后立即发出重复确认,而不要等到自己发送数据时才进行捎带确认。 所谓失序的报文是指,用户没有按照顺序收到 TCP 报文段,比如接收方收到了报文 M1, M2, M4,那么 M4 就称为失序 报文。

这样做的目的是可以让发送方尽可能早的知道报文段 M3 未到达接收方。快重传算法规定,如果发送方一连收到 3 个重复的确认,就应当立即传送对方未收到的报文 M3,而不必等待 M3 的重传计时器到期。
在这里插入图片描述

快恢复
快恢复算法配合快重传算法,其过程有以下两个特点:

  • 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限减半(不必等到真正发生拥塞时)。这是为了预防网络发生拥塞,但不执行慢开始算法。

  • 由于发送方现在认为网络很可能没有发生拥塞(如果网络发生了严重拥塞,就不会一连有好几个报文段连续到达接收方,也就不会导致接收方连续发送重复确认)。因此与慢开始不同之处就是现在不执行慢开始算法(即拥塞窗口现在不设置为1)而是把拥塞窗口的值设置为慢开始门限减半后的值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大

四次挥手

挥手为什么需要四次?
当服务端收到客户端发送的FIN报文后,并不会立刻关闭连接,因为服务端可能还有数据要发送。只能发送确认报文,告诉客户端你的请求我已经收到,等我发送我数据后再发送FIN报文。等服务端发送完FIN后客户端再发送一个确认报文,因此需要四次。
在这里插入图片描述

  • 1.客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。
  • 2.服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  • 3.客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  • 4.服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  • 5.客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  • 6.服务器只要收到了客户端发出的确认,立即进入CLOSED状态。

四次挥手释放连接时,等待2MSL的意义?

MSL–“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
保证客户端发送的最后一个ACK报文段能够到达服务端。

等待2*MSL的原因有两个:

  • 保证客户端发送的最后一个ACK报文段能够到达服务端。

这个ACK报文段有可能丢失,使得B收不到对已发送的FIN+ACK报文段的确认,服务端超时重传FIN+ACK报文段,而客户端能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务端都进入到CLOSED状态,若客户端在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务端重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则服务端无法正常进入到CLOSED状态。

  • 防止“已失效的连接请求报文段”出现在本连接中。

客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值