前排提示,这只是复习行文章。部分内容只是一笔带过!
基本概述
数据传输方式
电路交换
电路交换用于电话通信系统,两个用户要通信之前需要建立一条专用的物理链路,并且在整个通信过程中始终占用该链路。由于通信的过程中不可能一直在使用传输线路,因此电路交换对线路的利用率很低,往往不到 10%。
注意这里面的:两个用户专用,这条线即使你没有使用,别人也无法使用。整个数据从起点流到终点。
分组交换
每个分组都有首部和尾部,包含了源地址和目的地址等控制信息,在同一个传输线路上同时传输多个分组互相不会影响,因此在同一条传输线路上允许同时传输多个分组,也就是说分组交换不需要占用传输线路。
将数据分为很多小份,然后每个小份都会有起点和终点两个信息,所以可以在网络中流通,不一定是直接到终点,很多时候都是经过各种中间点转发到终点。
过程简介:
- 发送端:把较长的报文划分成较短的、固定长度的数据段。
- 一个数据段前面添加首部,构成分组。
- n分组交换网以分组作为数据传输单元。依次把各分组发送到接收端。
- 接收端收到后,去除首部信息,再还原数据。
报文交换
相当于前面两个一个中间产物,一个报文就是一个完整的数据,然后并不是和电路交换一样直接交付到终点,而是到相邻的节点,然后保存下来,重复这个过程,直到整个报文到达终点。
三种交换的图解:
时延
时延就是网络传输过程中由起点到终点整个过程经历的时长。
-
发送时延:主机或路由器传输数据帧所需要的时间。
-
传播时延:电磁波在信道中传播所需要花费的时间,电磁波传播的速度接近光速。
-
排队时延:分组在路由器的输入队列和输出队列中排队等待的时间,取决于网络当前的通信量。
-
处理时延:主机或路由器收到分组时进行处理所需要的时间,例如分析首部、从分组中提取数据、进行差错检验或查找适当的路由等。
总时延 = 发送时延 + 传播时延 + 处理时延 + 排队时延
计算机网络体系
五层协议
应用层
为特定应用程序提供数据传输服务,例如:HTTP、DNS等协议。数据单位为报文。我们接触的基本上都是应用层。
传输层
为进程提供通用数据传输服务。由于应用层协议很多,定义通用的传输层协议就可以支持不断增多的应用层协议。运输层包括两种协议:
-
传输控制层协议TCP,面向连接、可靠的数据层传输服务,数据单位为报文段。
-
用户数据报协议 UDP,提供无连接、尽最大努力的数据传输服务,数据单位为用户数据报。
TCP 主要提供完整性服务,UDP 主要提供及时性服务。
网络层
为主机提供数据传输服务。而传输层协议是为主机中的进程提供数据传输服务。网络层把传输层传递下来的报文段或者用户数据报封装成分组。
数据链路层
网络层针对的还是主机之间的数据传输服务,而主机之间可以有很多链路,链路层协议就是为同一链路的主机提供数据传输服务。数据链路层把网络层传下来的分组封装成帧。
物理层
考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异。
OSI标准
这里只解释表示层和会话层:
- 表示层:数据压缩、加密以及数据描述,这使得应用程序不必关心在各台主机中数据内部格式不同的问题。
- 会话层:建立及管理会话。
五层协议没有表示层和会话层,而是将这些功能留给应用程序开发者处理。
TCP/IP标准
它只有四层,相当于五层协议中数据链路层和物理层合并为网络接口层。
TCP/IP 体系结构不严格遵循 OSI 分层概念,应用层可能会直接使用 IP 层或者网络接口层。
数据在各层之间的传递过程:
在向下的过程中,需要添加下层协议所需要的首部或者尾部,而在向上的过程中不断拆开首部和尾部。
路由器只有下面三层协议,因为路由器位于网络核心中,不需要为进程或者应用程序提供服务,因此也就不需要传输层和应用层。
数据在各层之间的传递过程
在向下的过程中,需要添加下层协议所需要的首部或者尾部,而在向上的过程中不断拆开首部和尾部。
路由器只有下面三层协议,因为路由器位于网络核心中,不需要为进程或者应用程序提供服务,因此也就不需要传输层和应用层。
一张表看完每层协议有啥玩意
不要每个都看一遍,过个眼瘾就够了,记住常见的协议。
物理层
这真的是只传送0101!
名词速览
-
单工(simplex ) : 只能有一个方向的通信而没有反方向的交互。
-
半双工(half duplex ) :通信的双方都可以发送信息,但不能双方同时发送(当然也就不能同时接收)。
-
全双工(full duplex) : 通信的双方可以同时发送和接收信息。
-
失真:失去真实性,主要是指接受到的信号和发送的信号不同,有磨损和衰减。影响失真程度的因素:
- 码元传输速率
- 信号传输距离
- 噪声干扰
- 传输媒体质量
- 信道复用(channel multiplexing ) :指多个用户共享同一个信道。(并不一定是同时)。
主要功能
物理层主要做的事情就是 透明地传送比特流。也可以将物理层的主要任务描述为确定与传输媒体的接口的一些特性,即:机械特性(接口所用接线器的一些物理属性如形状尺寸),电气特性(接口电缆的各条线上出现的电压的范围),功能特性(某条线上出现的某一电平的电压的意义),过程特性(对于不同功能能的各种可能事件的出现顺序)。
物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。 现有的计算机网络中的硬件设备和传输媒体的种类非常繁多,而且通信手段也有许多不同的方式。物理层的作用正是尽可能地屏蔽掉这些传输媒体和通信手段的差异,使物理层上面的数据链路层感觉不到这些差异,这样就可以使数据链路层只考虑完成本层的协议和服务,而不必考虑网络的具体传输媒体和通信手段是什么。
几种常见的信道复用技术
- 频分复用(FDM) :所有用户在同样的时间占用不同的带宽资源。
- 时分复用(TDM) :所有用户在不同的时间占用同样的频带宽度(分时不分频)。
- 统计时分复用 (Statistic TDM) :改进的时分复用,能够明显提高信道的利用率。
- 码分复用(CDM) : 用户使用经过特殊挑选的不同码型,因此各用户之间不会造成干扰。这种系统发送的信号有很强的抗干扰能力,其频谱类似于白噪声,不易被敌人发现。
- 波分复用( WDM) :波分复用就是光的频分复用。
数据链路层
上面全部是一些基本的名词介绍,协议啥的都还没开始,接下来就一层一层的拨开这些基本的协议原理。
基本介绍
我们直到物理层几乎屏蔽了所有细节,只用来进行真是的信号传输,但是通信有很多的方式,比如点对点,广播。这些又是怎么来的?
在这之前先来回顾一下各种名词:
- 链路(link) :一个结点到相邻结点的一段物理链路。
- 数据链路(data link) :把实现控制数据运输的协议的硬件和软件加到链路上就构成了数据链路。
- 帧(frame) :一个数据链路层的传输单元,由一个数据链路层首部和其携带的封包所组成协议数据单元。
- MAC 地址(Media Access Control 或者 Medium Access Control) :意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。在 OSI 模型中,第三层网络层负责 IP 地址,第二层数据链路层则负责 MAC 地址。因此一个主机会有一个 MAC 地址,而每个网络位置会有一个专属于它的 IP 地址 。地址是识别某个系统的重要标识符,“名字指出我们所要寻找的资源,地址指出资源所在的地方,路由告诉我们如何到达该处。
- 网桥(bridge) :一种用于数据链路层实现中继,连接两个或多个局域网的网络互连设备。
- 交换机(switch ) :广义的来说,交换机指的是一种通信系统中完成信息交换的设备。这里工作在数据链路层的交换机指的是交换式集线器,其实质是一个多接口的网桥
点对点通信
先来看一下通信的图,假设我们屏蔽物理层,数据就是从链路层到另一个链路层:
点对点信道数据链路层的通信步骤:
- 结点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧
- 结点A把封装好的帧发送给结点B的数据链路层
- 若结点B的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据报上交给上面的网络层;否则,丢弃该帧
这个时候就出现了三个问题:帧的封装,透明传输,差错检测。
帧的封装
将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束。
[ PS ]:首部和尾部:帧定界,必要的控制信息,就是告诉别人一大串信息中我发给你的数据是从哪开始,到哪结束。
用控制字符进行帧定界的方法举例
假设我们发送的数据是一个字符串,然后使用一些极其少见的字符用来夹在这个数据的首部和尾部。
帧定界符设计:采用不可打印的控制字符
-
帧开始符:SOH(ASCII码:0x01)。
-
帧结束符:EOT(ASCII码:0x04)。
这样一来,无论你发送的是啥,每次遍历到SOH我就开始记录数据,到EOT就结束,中间这个部分就是需要的数据。是不是很简单!
但这样搞还是有问题的,比如,我数据里面本身包含EOT。
这样可得不到完整的数据!这就涉及到第二个问题:透明传输。
透明传输
透明表示一个实际存在的事物看起来好像不存在一样。
其实这个我们一直在使用,比如在Java中,我们使用 \ 来表示转义,比如:
print("a\nbc"); //这个时候换行显示,因为\n表示回车换行
那如果我就是需要使用这种方式显示这个n呢?
print("a\\nbc"); //想起来了吗
这样就很好的解决了换行问题。这里采用的方式和这个一模一样!
发送端:在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符,如:“ESC”(ASCII码:0x1B)
接收端:在将数据送往网络层之前删除插入的转义字符。
若转义字符出现数据中:在转义字符前面插入一个转义字符。当接收端收到连续的两个转义字符时,就删除前面的一个。
在接收端进行处理之后可以还原出原始数据。这个过程透明传输的内容是转义字符,用户察觉不到转义字符的存在。
这个时候还剩下最后一个问题:差错检测。
差错检测
要知道,网络这个玩意不可靠,随时随地给你丢了一些数据,那又如何保证接收到的数据一定是完整的呢?
传输过程中可能产生比特差错:1 可能会变成 0 , 0 可能变成 1。
误码率:传输错误的比特占所传输比特总数的比率。
为了保证数据传输的可靠性,必须采用各种差错检测措施。
一个简单的例子
要传输的数据:1 2 2 3
在数据后面加上校验码:1 2 2 3 X
校验码生成方法:sum(1,2,2,3) % 3
发送的数据:1 2 2 3 2
接收方验证:sum(1,2,2,3) % 3 == 2
最后得到的余数等于和发送的余数是一样的。这个时候就认为这个数据是一个完整的数据。当然这只是一个简单的例子,存在很多问题,比如第1个2变成1,第2个2变成3,依然会被当作正确的数据。
所以总有大佬想到一些奇葩方式来尽最大努力减少这些问题。
循环冗余CRC检验的原理(这个就不过多展开了,想了解的,自行百度,并不难)
广播信道
一对多通信,一个节点发送的数据能够被广播信道上所有的节点接收到。
既然是广播,那你可以说话,我也可以说话,但是开会的时候一般都只会有一个人说话,要不人都说,谁听得清。因此需要有专门的控制方法进行协调,避免发生冲突(冲突也叫碰撞)。
主要有两种控制方法进行协调,一个是使用信道复用技术,一是使用 CSMA/CD 协议。
CSMA/CD 协议
最初的以太网将计算机连接到一根总线上。简单可靠,因为总线上没有有源器件。
-
每个计算机都能检测到B发送的数据信号。
-
只有计算机 D 的地址与数据帧首部的地址一致,因此,只有D接收这个数据帧。
-
其他计算机丢弃这个数据帧。
-
具有广播特性的总线上实现了一对一的通信。
名词速览
多点接入:计算机以多点接入的方式连接在一根总线上。
载波监听:发送前先监听。每个站在发送数据之前,先检测总线上是否有其他站在发送数据。如果有,则先不要发送,以免发生碰撞。
碰撞检测:边发送边监听。计算机边发送数据边检测信道上信号电压大小。当检测到信号电压摆动值超过一定门限,就认为至少有两个站同时在发送数据,即:产生了碰撞(冲突)。
载波监听
发生碰撞时,总线上传输的信号产生严重的失真,无法从中恢复出有用的信息。检测到碰撞时,就要立即停止发送,免得继续浪费网络资源,然后等待一段随机时间再次发送。
所以说,就是现在都在发送数据,我一边检测一边发送,如果我监听到别的数据,我马上就停止发送,你听到了,你也停止发送。让这个信道空下来。然后过了一会我在尝试发送。
至于停多久,可自行搜索:截断二进制指数退避算法
也就是说CSMA/CD 协议的以太网只能进行半双工通信
MAC 层的硬件地址
局域网中,硬件地址又称物理地址、MAC 地址。
集线器很像一个多接口的转发器,工作在物理层,每个接口简单地进行比特转发,不进行碰撞检测。使用集线器的以太网在逻辑上仍是一个总线网,各工作站使用CSMA/CD 协议,并共享逻辑上的总线。
总的来说,使用这个玩意,就是扩大电脑主机数。
MAC 帧格式
网桥
在数据链路层扩展局域网:网桥。
工作原理:通过检查帧的目的 MAC 地址,实现转发:确定将该帧转发到哪个接口。
网桥和集线器的区别
-
集线器工作在物理层,只进行比特转发,不进行碰撞检测。
-
网桥工作在数据链路层,在转发帧之前必须执行 CSMA/CD 算法。若在发送过程中出现碰撞,就必须停止发送和进行退避
网桥可是一个“智能”的玩意,里面记录每个机子对应的自己的接口。
透明网桥
透明:局域网上的站点并不知道所发送的帧将经过哪几个网桥,因为网桥对各站来说是看不见的。那么这里有一个问题,这张表是怎么来的?
其实这并不难想到,每一别人发送数据,经过我,我就查表,有就转发到对应的接口,没有就把这个发送的机子登记到表中对应哪个接口然后广播出去,等对方回信,然后又经过我,这样一来数据不就到手了吗。
这个里面还有很多小问题,更多解析就自行学习吧。
网络层
基本概述
网络层是整个互联网的核心,因此应当让网络层尽可能简单。网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。
使用 IP 协议,可以把异构的物理网络连接起来,使得在网络层看起来好像是一个统一的网络。
就比如这张图中,对用户而言,我管你怎么连接的哦,我只知道交了网费就可以跟对方通信。
在这一层涉及的协议:
需要重点理解图中三个协议。
网络中连接的中间设备
中间设备:中继(relay)系统。
-
物理层:转发器(repeater)、集线器(hub)。
-
数据链路层:网桥 (bridge)、交换机(switch)。
-
网络层:路由器(router)。
当中继系统是转发器或网桥时,一般并不称之为网络互连:因为这仅仅是把一个网络扩大了,仍然是一个网络。 互联网指用路由器进行互连的网络。
互连网络与虚拟互连网络:
这一层是要是利用IP地址经行目标主机的查找。
IP基本介绍
IP数据报格式如下:
- 版本 : 有 4(IPv4)和 6(IPv6)两个值;
- 首部长度 : 占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。因为固定部分长度为 20 字节,因此该值最小为 5。如果可选字段的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。
- 区分服务 : 用来获得更好的服务,一般情况下不使用。
- 总长度 : 包括首部长度和数据部分长度。
- 生存时间 :TTL,它的存在是为了防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当 TTL 为 0 时就丢弃数据报。
- 协议 :指出携带的数据应该上交给哪个协议进行处理,例如 ICMP、TCP、UDP 等。
- 首部检验和 :因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量。
- 标识 : 在数据报长度过长从而发生分片的情况下,相同数据报的不同分片具有相同的标识符。
- 片偏移 : 和标识符一起,用于发生分片的情况。片偏移的单位为 8 字节。
IP 地址划分
IP地址:给每个因特网上的主机(路由器)分配的全世界唯一的32位标识符。IP 地址 = { <网络号>, <主机号>}
- 网络号net-id:标志主机(路由器)所连接到的网络。
- 主机号host-id:标志该主机(路由器)。
点分十进制记法:
IP地址是标志一个主机(或路由器)和一条链路的接口。
主机同时连接两个网络:该主机必须具有两个IP地址,其网络号必须不同,路由器至少有两个不同的 IP 地址。
路由器总是具有两个或两个以上的 IP 地址。路由器的每个接口都有一个不同网络号的 IP 地址。
IP地址与硬件地址
每个IP都有自己对应的MAC地址,这个过程是怎么巡查,映射的,这就是ARP地址解析协议。
ARP 地址解析协议
网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。
每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。
[ PS ]:ARP 高速缓存(ARP cache):IP 地址到硬件地址的映射表。(cmd命令:arp -a)
如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。
这样一来,本机就可以知道这个网络中所有的需要连接的目的主机的IP与MAC对应关系,下次发送直接查表即可。
为什么不直接使用硬件地址进行通信?
不同的网络使用不同的硬件地址。要使这些异构网络互相通信,必须进行非常复杂的硬件地址转换,几乎是不可能的事。
连接到因特网的主机拥有统一 IP 地址,它们之间的通信就像连接在同一网络上那样简单方便。过程:调用 ARP 来寻找某个路由器或主机(IP地址)的硬件地址由计算机软件自动进行,对用户来说是透明的。
ARP地址解析协议有一个缺点就是容易被欺骗,也就是ARP双向欺骗!(这个自行搜索资料学习)
子网
早期的IP地址设计不够合理。
-
IP地址空间的利用率有时很低(A类网络可连接的主机数超过1000万)。
-
给每个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。
-
两级的 IP 地址不够灵活。
三级 IP 地址 :在IP地址中增加子网号字段,两级IP地址变成三级IP地址,用来划分子网。
IP地址 ::= {<网络号>, <子网号>, <主机号>}
如上图,整个大网络内部划分3个小网络,对外表现依然是一个大网络。
问题:从IP数据报的首部无法判断源主机或目的主机所连接的网络是否进行了子网划分(以及如何划分)。
解决办法:使用子网掩码(subnet mask)找出 IP 地址中的子网部分。
这样一来,外部就可以通过子网掩码来访问具体的内部网络的某个网络。
无分类编址
无分类编址 CIDR 消除了传统 A 类、B 类和 C 类地址以及划分子网的概念,使用网络前缀和主机号来对 IP 地址进行编码,网络前缀的长度可以根据需要变化。
IP 地址 ::= {< 网络前缀号 >, < 主机号 >}
CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀。
CIDR 的地址掩码可以继续称为子网掩码,子网掩码首 1 长度为网络前缀的长度。
一个 CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为 构成超网 。
[ PS ]:路由表中查询使用的是二叉树结构
网际控制报文协议 ICMP
ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。
ICMP报文作为IP层数据报的数据,加上数据报的首部,组成 IP 数据报。
Ping
Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。
Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。
Traceroute
traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。
Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。
- 源主机向目的主机发送一连串的 IP 数据报。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 减 1,此时 TTL 等于 0,R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文;
- 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达 R1,R1 收下后把 TTL 减 1 再转发给 R2,R2 收下后也把 TTL 减 1,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。
- 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为数据报封装的是无法交付的 UDP,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
- 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。
传输层
网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。
主机间通信:实质是两个主机中的应用进程互相通信
这个部分主要就有两协议:UDP和TCP
- 用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
- 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。
UDP协议
首先看一下UDP的格式:
通信过程:
- 发送方:对应用层提交的报文,既不合并,也不拆分。即:一次发送一个报文
- 接收方 :对IP层交付的报文,去除首部后原封不动交付,一次交付一个完整的报文
- 应用程序选择合适大小的报文
TCP协议
基本概述
首先忽略网络层以及以下的所有,单从传输层来看一下通信过程:(TCP 面向流的概念)
-
发送方与接收方建立连接。
-
发送方发送数据,封装成TCP格式,直接交付接收方。
-
接收方按照格式拆分得到数据。
这个过程就需要知道TCP的数据格式:
重点字段解释:
- 序号 :用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
- 确认号 :期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
- 数据偏移 :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。
- 确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
- 同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。
- 终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。
- 窗口 :窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
在两个进程之间的通信是通过IP+端口,IP定位哪台主机,端口定位这个主机上的进程。
这里就引入了套接字这个玩意:套接字 socket = (IP地址: 端口号)
每一条TCP连接由通信的两个端点(即两个套接字)确定。
即:TCP 连接 ::= {socket1, socket2} = {(IP1: port1), (IP2: port2)}
可靠传输工作原理
TCP是提供可靠传输的,那是怎么保证这个可靠性的。这里就来进行展开讲解。
理想传输条件:
-
传输信道不产生差错。
-
不管发送方以多快的速度发送,接收方总是来得及处理收到的数据(速度匹配)
但是大部分都不是理想传输,这个时候怎么解决产生差错和速度匹配呢?
-
出现差错:“通知”发送方重传;
-
接收方来不及处理收到的数据(速度不匹配):“通知”发送方降低发送速度
超时重传
TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。
这个分三个部分,停止等待和确认丢失以及确认迟到。
- 停止等待,就是我发送后过了一个来回时间多一点还没有收到回信,就重发:
- 确认丢失,就是我收到你的,但是我发送给你的丢了,然后你又重发给我,我就知道上一个发给你的丢了,然后我再重发这个:
- 确认迟到,我收到了,也回了,但是由于网络阻塞这个回信活了很久都没有到你手里,然后你重发给了我,我又觉得上一个因该是丢了,也重发给你,你收到了,结果哪个阻塞的到了,这个时候丢掉这个后到的:
所以总结,可靠通信的实现就是靠超时重传和确认机制保证的。
滑动窗口
假定A收到了B发来的确认报文段。窗口值20,确认号31(表明序号30以前的数据B已收到,期望收到的下一个序号为31)。A根据这两个数据,构造自己的发送窗口。
根据 B 给出的确认报文(窗口值20,确认号31),A 构造出自己的发送窗口。
窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。
发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。
接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
-
A 的发送窗口并不总是和 B 的接收窗口一样大(有一定的时间滞后)。
-
接收方:累积确认,以减小传输开销。
-
捎带技术:接收方可以在自己有数据要发送时把确认信息顺便捎带上。
流量控制
利用上面的滑动窗口来实现流量的控制。
问题:如果发送方发送过快,接收方来不及接收,数据丢失。
流量控制:让发送方的发送速率不要太快,即:要让接收方来得及接收。这个就可以利用滑动窗口机制。
拥塞控制
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。
这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。具体区别如下:
- 流量控制:发送端和接收端之间的点对点通信量的控制。抑制发送端的发送速率,以便使接收端来得及接收。
- 拥塞控制:全局性过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。
TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
给看一下拥塞控制的图:
慢开始
设置慢开始门限状态变量ssthresh,为防止拥塞窗口cwnd增长过大引起网络拥塞,设置门限状态变量ssthresh。
ncwnd < ssthresh:慢开始算法。
-
拥塞窗口初值:cwnd=1,一个最大报文段大小MSS 的数值。
-
收到对新报文段的确认:将拥塞窗口*2
-
逐步增大发送端的拥塞窗口cwnd,从而逐步增加分组注入到网络的速率。
发现了吗,由于是一个指数函数,所以慢开始只不过起步慢,增长可不慢!
拥塞避免
cwnd > ssthresh:拥塞避免算法。
此时不在按照指数增长,而是一个一个的增大,避免网络一下堵死。
快重传和快恢复
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。
在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。
三次握手
需要发送数据之前,就需要建立连接,建立连接就涉及三次握手:
过程如下,假设 A 为客户端,B 为服务器端。
- 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
- A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
- B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
- A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。
- B 收到 A 的确认后,连接建立。
三次握手的原因
第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。
客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。
四次挥手
以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。
- A 发送连接释放报文,FIN=1。
- B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
- 当 B 不再需要连接时,发送连接释放报文,FIN=1。
- A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
- B 收到 A 的确认后释放连接。
四次挥手的原因
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
TIME_WAIT
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:
- 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
- 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。
应用层
这个层次都是基于TCP或者UDP两种协议引申出的高级协议。
域名系统(DNS)
DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据。(域名就是为了遍历老百信记得住,你记得百度,但是你记得百度的IP吗)
DNS 可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。大多数情况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。
文件传送协议
用于 Internet 上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的 FTP 应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在 FTP 的使用当中,用户经常遇到两个概念:“下载”(Download)和"上传"(Upload)。 "下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用 Internet 语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
FTP 使用 TCP 进行连接,它需要两个连接来传送一个文件:
- 控制连接:服务器打开端口号 21 等待客户端的连接,客户端主动建立连接后,使用这个连接将客户端的命令传送给服务器,并传回服务器的应答。
- 数据连接:用来传送一个文件数据。
动态主机配置协议
DHCP (Dynamic Host Configuration Protocol) 提供了即插即用的连网方式,用户不再需要手动配置 IP 地址等信息。
DHCP 配置的内容不仅是 IP 地址,还包括子网掩码、网关 IP 地址。
电子邮件协议
一个电子邮件系统由三部分组成:用户代理、邮件服务器以及邮件协议。
邮件协议包含发送协议和读取协议,发送协议常用 SMTP,读取协议常用 POP3 和 IMAP。
超文本传输协议(HTTP)
这个部分后面单独写。
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。1960 年美国人 Ted Nelson 构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了 HTTP 超文本传输协议标准架构的发展根基。
HTTP 协议的本质就是一种浏览器与服务器之间约定好的通信格式。HTTP 的原理如下图所示:
转载:https://blog.csdn.net/weixin_55086330/article/details/115150101