文章目录
IP
1、速率
速率:网络技术中的速率指的是连接在计算机网络上的主机在数字信道上传数据的速率,它也称为数据率(data rate)或比特率(bitrate)。
速率是计算机网络中最重要的一个性能指标。
速率的单位是 b/s,bit/s,bps。
当数据率较高时,就可以用 kb/s(10
3
),Mb/s(10
6
),Gb/s
9
,Tb/s(10
12
)
上面所说的速率往往是指额定速率或标称速率
2、IP 地址
网络层功能:寻址和路由选择
计算机网络层的主要目的是实现两个系统之间的数据透明传送,具体功能包括寻址和路由选择,连接的建立,保持和终止等。而实现点对点通信的基础,就是每个节点必须有一个IP地址,数据从哪来(源节点),到哪去(目的节点)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Z305JAe-1626960266865)(https://i.loli.net/2021/04/13/L59aXbUVOMDWt8I.png)]
3、IP 地址的概念及产生
1、MAC地址
物理地址(48位),每台机器出厂时规定的唯一地址。如果根据物理地址来判断某台主机,数据十分庞大且不利于管理。
2、IP 地址
逻辑地址(32位),可以由用户根据规定进行更改和设置。
这两类地址,需要
解析协议ARP
与
逆地址解析协议 RARP
来进行翻译。
由于通过各种物理网络存在异构性,利用 IP 协议就可以使这些性能各异的网络用户看起来好像一个统一的,抽象的逻辑互联网络,称之为 虚拟互联网。
IP 地址就是给每个连接在因特网上的主机(或路由器)分配一个在全世界范围是唯一的 32 位的标识符,它是一种分等级的地址结构,由因特网名字与号码指派公司 ICANN 进行分配。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LXJRWLSY-1626960266874)(https://i.loli.net/2021/04/13/Te42fwm9sKgYcX1.png)]
4、IP 地址的格式
每一类地址都由两个固定长度的字段组成,
- 网络号 net-id:它标志主机 (或路由器) 所连接到的网络
- 主机号 host-id:它标志该主机(或路由器)。
IP 地址通常由点分十进制的方式来表示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hrXWC0Y8-1626960266877)(https://i.loli.net/2021/04/13/HKPd2mbz7Tk1MWe.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oaKmTUB3-1626960266880)(https://i.loli.net/2021/04/13/LwFgrCBW31olibm.png)]
5、地址的分类
根据网络号和主机号的不同,分为 A,B,C,D,E 类。
A类网络号少,网络内主机号多,通常是比较大的网络,如一个国家或地区的网络。
B类或C类,网络号逐渐增多,但每个网络内的主机号逐渐减少。比如我们学校或者公司的网络,可以容纳的数量有限,通常使用的C类网络。
D类和E类属于比较特殊的网络,分别用于多播和备用。
6、子类划分
两级划分有以下缺点:
- IP 地址空间的利用率低
- 给每一个物理网络分配一个网络号会使路由表变得太大
- 两级的 IP 地址不够灵活。
因此,需要子网划分:
- 在 IP 地址中增加了一个 “子网号字段”,使两级的 IP 地址变为三级的 IP 地址。
- 从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相当减少了若干个位。
- 通过子网掩码与 IP 地址相与,可以求得子网号。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S5mh42yK-1626960266882)(https://i.loli.net/2021/04/13/ta2gUmpcsDnJ9S3.png)]
7、子网划分结果
子网划分后,虽然从外界转入的路由器地址不变,但通过路由器转入的数据,可以通过子网掩码来进行分发。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YAmH5ujz-1626960266883)(https://i.loli.net/2021/04/13/LCrfR4y5cqsadHV.png)]
8、总结
IP 地址划分为 A,B,C,D,E 五类
1、A 类地址
- A 类地址第 1 字节为网络地址,其它3个字节为主机地址。
- A 类地址范围:1.0.0.0—127.255.255.255
-
A 类地址中的私有地址和保留地址:
- 10.0.0.0—255.255.255.255 是私有地址(所谓的私有地址就是在互联网上不使用而被用在局域网络中的地址)
- 127.0.0.0—127.255.255.255 是保留地址,用做循环测试用的。
2、B 类地址
- B 类地址第 1 字节和第 2 字节为网络地址,其它 2 个字节为主机地址。
- B 类地址范围:128.0.0.0—191.255.255.255
-
B 类地址的私有地址和保留地址
- 172.16.0.0—172.31.255.255 是私有地址
- 169.254.0.0—169.254.255.255 是保留地址。如果你的 IP 地址是自动获取 IP 地址,而你在网络上又没有找到可用的 DHCP 服务器。就会得到其中一个 IP 。
3、C 类网络
- C 类地址第 1 字节,第 2 字节和第 3 个字节为网络地址,第 4 个字节为主机地址。另外第 1 个字节的前三位固定为 110。
- C 类地址范围:192.0.0.1—255.255.255.254
- C 类地址中的私有地址:192.168.0.0—192.168.255.255 是私有地址。
4、D 类地址
- D 类地址部分网络和主机地址,它的第 1 个字节点的前四位固定为 1110 。
- D 类地址范围:224.0.0.0—239.255.255.255
组播报文的目的地址使用 D 类 IP 地址
范围是从 224.0.0.0 到 239.255.255.255 。D 类地址不能出现在 IP 报文的源 IP 地址字段。
224.0.0.0—224.0.0.255 为预留的组播地址(永久组地址)只能用于局域网中,路由器是不会转发的地址。
224.0.1.0—238.255.255.255 为用户可用的组播地址(临时组地址),可以用于 Internet 上的。
239.0.0.0—239.255.255.255 为本地管理组播地址,仅在特定的本地范围内有效。
5、E 类地址
- E 类地址也不分网络地址和主机地址,它的第1个字节的前五位固定为 1110
- E 类地址范围:240.0.0.0—255.255.255.255 。
6、计算掩码的方法
通过子网数来算
例如:需要将B 类 IP 地址 167.194.0.0 划分成 28 个子网:255.255.0.0
- (28)10 = (11100)2; 255.255.0.0
- 此二进制的位数是 5,则 N = 5;
- 此 IP 地址为 B 类地址,而 B 类地址的子网掩码是 255.255.0.0,且 B 类地址的主机地址是后 2 位(即0—255.1-254)。于是将子网掩码 255.255.0.0 中的主机地址前 5 位全部置 1 ,就可得到 255.255.248.0 ,而这组数据就是划分成 28 个子网的 B 类 IP 地址 167.194.0.0 的子网掩码。
利用主机数来计算
例如:需将 B 类 IP 地址 167.194.0.0 划分成若干个子网,每个子网内有主机 500 台:
- (500)10 = (111110100)2;
- 此二进制的位数是 9,则 N = 9
- 将该 B 类地址的子网掩码 255.255.0.0 的主机地址置 1,得到 255.255.255.255 。然后在从后向前将后 9 位置为 0 ,可得 11111111.11111111.11111110.00000000 即 255.255.254.0 。这组数值就是划分成主机为 500 台的B 类 IP 地址 167.194.0.0 的子网掩码
利用子网掩码计算最大有效子网数
A 类 IP 地址,子网掩码为 255.252.0.0,将它划分成若干子网络,每个子网络中可用主机数有多少?
1. 将子网掩码转换成二进制表示 11111111.11111100.0000000.00000000
2. 统计一下它的主机位共有 18 位
3. 最大可用主机数就是 2 的 18 次方减 2(除去全是 0 的网络地址和去拿时 1 广播地址),即每个子网络最多有 262142 台主机可用。
利用子网掩码确定子网络的起止地址
B 类 IP 地址 172.16.0.0,子网掩码为 255.255. 192.0,它所能划分的子网络起止地址是多少?
- 利用子网掩码计算,最多可以划分 4 个子网络
- 利用子网掩码计算,每个子网络可容纳 16384 台主机(包括网络地址和广播地址)
- 用 16384 除以 256 (网段包括网络地址和广播地址的全部主机数),结果是 64
- 具体划分网络起止方法如下:
172.16.0.0~172.16.63.255
172.16.64.0~172.16.127.255
172.16.128.0~172.16.191.255
172.16.192.0~172.16.255.255
网络基础
1、OSI 七层模型
描述一个网络中各个协议层的常用方法是使用国际标准化组织 (ISO)的计算机开放系统互连(OSI)模型,这是一个七层模型,如下图所示,图中同时给出了它与网络协议族的近似映射。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SF0kOa9c-1626960266893)(https://i.loli.net/2021/04/13/zhx68lOyDYugkQV.jpg)]
1、物理层
主要定义物理设备标准,如网线的接口类型,光纤的接口类型,各种传输介质的传输速率。它的主要作用是传输比特流(就是 1,0 转化为电流强弱来进行传输,到达目的地后再转化为 1,0,也就是说我们常说的数模转换与模数转换)。这一层的护具叫做比特。
2、数据链路层
定义了如何让格式化数据以帧为单位进行传输,以及如何控制对物理介质的访问。这一层还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的 115200,8,N,1
3、网络层(负责传送)
在位于不同地理位置的网络的两个主机系统之间提供连接和路径选择。Internet 的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
4、传输层(负责打包和拆包)
定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据协议,与TCP 特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。主要是
将从下层接收的数据进行分段和传输,到达目的地地址后再进行重组
。常常把这一层数据叫做段。
5、会话层
通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是 IP 也可以是 MAC 或者是主机名)。
6、表示层
可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取,例如, PC 程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换吗(EBCDIC),而另一台则使用美国信息交换码(ASCII)来表示相同的字符,如有必要,表示层会通过使用一种通用格式来实现多种数据格式之间的转换。
7、应用层:
是最靠近用户的 OSI 层。这一层为用户的应用程序(例如电子邮件,文件传输和终端仿真)提供网络服务。
2、TCP/IP 四层模型
TCP/IP 协议族是一个四层协议系统,自底而上分别是数据链路层,网络层,传输层和应用层。每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务。
对应OSI 七层模型:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a4uYjPfp-1626960266895)(…/MDFile/Linux 网络编程/Untitled.assets/0-1614566937798.jpg)]
1、数据链路层
数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(比如以太网,领牌环等)上的传输。
数据链路层两个常用的协议是 ARP 协议(地址解析协议)和 RARP 协议(逆地址解析协议)。它们实现了 IP 地址和机器物理地址(MAC地址)之间的相互转换。
网络层使用 IP 地址寻址一台机器,而数据链路层使用物理地址寻址一台机器,因此网络层必须先将目标机器的 IP 地址转化成其物理地址,才能使用数据链路层提供的服务,这就是 ARP 协议的用途。
RARP 协议仅用于网络上的某些无盘工作站。因为缺乏存储设备,无盘工作栈无法记住自己的 IP 地址,但它们可以利用网卡上的物理地址来向网络管理者(服务器或网络管理软件)查询自身的 IP 地址。运行 RARP 服务的网络管理者通常存有该网络上所有机器的物理地址到 IP 地址的映射。
2、网络层
网路层实际数据包的选路和转发。
WAN(广域网) 通常使用众多分级的路由器来连接分散的主机或 LAN(局域网),因此,通信的两台主机一般不是直接相连的,而是通过多个中间节点(路由器)连接的。网路层的任务就是选择这些中间节点,以确定两台主机之间的通信路径。同时,网络层对上层协议隐藏了网络拓扑连接细节,使得在传输层和网络应用程序看来,通信的双方是直接相连的。
网络层最核心的协议是 IP 协议(因特网协议)。IP 协议根据数据包的目的 IP 地址来决定如何投递它。如果数据报不能直接发送给目标主机,那么 IP 协议就为它虚招一个合适的下一跳路由器,并将数据报交付给该路由器来转发。多次重复这一过程,数据报最终到达目标主机,或者由于发动失败而被丢弃。可以, IP 协议使用 逐跳的方式确定通信路径。
网路层另外一个重要的协议是 ICMP 协议(因特网控制报文协议)。它是 IP 协议的重要补充,主要用于检测网络连接。
8 位类型字段用于区分报文类型。它将 ICMP 报文分为两大类
差错报文,这类报文主要用来回应网络错误,比如目标不可到达(类型指为 3) 和重定向(类型值为 5):
查询报文,这类报文用来查询信息,比如 ping 程序就是使用 ICMP 报文查看目标是否可到达(类型值为8)的。
有的 ICMP 报文还是用 8 位代码字段来进一步细分不同的条件。比如重定向报文使用代码值 0 表示对网络重定向,代码值 1 表示对主机重定向。
ICMP 报文使用 16 位校验和字段对整个报文(包括头部和内容部分)进行循环冗余校验(CRC),以检验报文在传输过程中是否损坏。不同的 ICMP 报文类型具有不同的正文内容。
3、传输层
传输层为两台主机上的应用程序提供端到端的通信。与网络层使用的逐跳通信方式不同,传输层只关心通信的起始端和目的端,而不在乎数据包的中转过程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VC0CrBy5-1626960266898)(https://i.loli.net/2021/04/13/VKC6NyPz2jYevmh.jpg)]
垂直的实线箭头表示 TCP/IP 协议族各层之间的实体通信(数据包确实是沿着这些线路传递的),而水平的虚线箭头表示逻辑通信线路。该图中还附带描述了不同物理网络的连接方法。可见。
数据链路层(驱动程序) 封装了物理网络的电气细节;网络层封装了网咯连接的细节;传输层则为应用程序封装了一条端到端的逻辑通信链路,它负责收集的收发,链路的超时重传等。
传输层协议:TCP 协议,UDP 协议
特性 | TCP 协议 | UDP 协议 |
---|---|---|
服务 | 可靠的,面向对象的,基于流 | 不可靠,无连接,基于数据报 |
超时重转 | 有 | 无 |
4、应用层
应用层负责处理应用程序的逻辑。
数据链路层,网络层和传输层负责处理网络通信细节,这部分必须既稳定又高效,因此它们都在内核空间中实现。而应用程则在用户空间中实现,因为它负责处理众多逻辑,比如文件传输,文件查询和网络管理等。如果应用层也在内核中实现,则会使内核变得非常庞大。当然,也有少数服务器程序时在内核中实现的,这样代码就能无须在用户空间和内核空间来回切换(主要是数据的复制),极大地提高了工作效率。不过这种代码实现起来较复杂,不够灵活,且不便于移植。
ping是应用程序,而不是协议,它利用 ICMP 报文检测网络连接,是调试网络环境的必备工具。
telnet 协议是一张远程登录协议,它使我们能在本地完成远程任务。
OSPF(开放最短路径优先)协议是一种动态路由更新协议,用于路由器之间的通信,以告诉对方各自的路由信息。
DNS(域名服务) 协议提供机器域名到IP 地址的转换。
应用层协议(或程序)可能跳过传输层直接使用网络层提供的服务,比如 ping 程序和 OSPF 协议。应用层协议(或程序)通常既可以使用 TCP 服务,又可以使用 UDP 服务,比如 DNS 协议。我们可以通过 /etc/services 文件查看所有知名的应用层协议,以及他们都能使用哪些传输层服务。
四层协议背后的思想:上层屏蔽下层细节,只是用其提供的服务。高内聚低耦合,每层专注于其功能,各层之间的关系依赖不大。
数据包在每层有不同的格式,从上到下依次叫 段,数据报,帧,数据从应用层通过协议栈向下专递,每经过一层加上对应层协议的报头,最后封装成帧发送到传输介质上,到达路由器或者目的主机剥掉头部,交付给上层需要者。这一过程称为封装,传输,分离,分用。
3、网络协议的概念
网络协议为计算机网络中进行数据交换而建立的规则,标准或约定的集合。
4、常见的网络协议
1、应用层
1、HTTP(超文本传输协议)
是一种用于分布式,协作式和超媒体信息系统的应用层协议。简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息(80端口)。
2、HTTPS(超文本传输安全协议)
是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用
SSL/TLS
来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私和完整性(443端口)。
3、FTP(文件传输协议)
是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层,TCP 模型的第四层,即应用层,使用TCP 传输而不是 UDP,客户在和服务器建立连接前要经过一个 “三次握手” 的过程,保证客户与服务器之间的连接时可靠的,而且是面向连接,为数据传输提供可靠保证。(21端口)。
4、SMTP(简单邮件传输协议)
是一种提供可靠且有效的电子邮件传输的协议。SMTP 是建立在 FTP 文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有效的数据量信息支持,SMTP 的重要特性之一是其能跨越网络传输邮件,即 “SMTP邮件中继“。使用 SMTP,可实现相同网络处理进程之间的邮件传输,也可以通过中继器或网关实现某处理进程与其他网络之间的邮件传输(25端口)。
5、POP3(有据协议版本3)
是 TCP/IP 协议族中的一员,有 RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了 SSL 加密的 POP3 协议被称为 POP3S(110端口)。
6、IMAP(因特昂邮件访问协议)
IMAP 是斯坦福大学在 1986 年开发的一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的全为定义是 RFC3501。IMAP 协议运行在 TCP/IP 协议智商,使用的端口是 143.它与 POP3 协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作(143端口)。
7、DNS(域名系统)
是一种
分布式网络目录服务
,主要用于域名与 IP 地址的相互转换,以及控制因特网的电子邮件的发送(53端口)。
2、传输层
1、TCP(传输控制协议)
TCP提供 IP 环境下的数据
可靠传输
,它提供的服务包括
数据流
传送,可靠性,有效流控,全双工操作和多路复用。通过面向连接,端到端和可靠的
数据包
发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后在进行数据发送;而 UDP 则不为 IP 提供可靠性,流控或差错恢复功能。一般来说,TCP 对应的是可靠性要求高的应用,而 UDP 对应的则是可靠性要求低,传输经济的应用。
2、UDP(用户数据报协议)
UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
3、网络层
1、IP(因特网协议)
是
TCP/IP
体系中的网络层协议。设计 IP 的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模,异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据
端到端
的设计原则,IP 只为主机提供一种无连接,不可靠的,尽力而为的数据报传输服务。
2、ICMP(控制消息协议)
用来给 IP 协议提供控制服务,允许路由器或目标主机给数据的发送方提供反馈信息。需要发送反馈信息的情况包括:数据包不能被发送到目标主机,路由器缓冲区溢出导致数据包被删除,路由器想要把流量重定向到另外一个更短的路由上等。
3、IGMP(互联网组管理协议)
是一种互联网协议,提供这样一种方法,使得互联网上的主机向邻近路由器报告它的广播组成员。广播使得互联网上的一个主机向网上确认对于源主机发送内容感兴趣的计算机发送信息。
4、RIP(路由信息协议)
是基于距离矢量算法的路由协议,利用跳数来作为计量标准。
5、OSPF(开放式最短路径优先)
是一个内部网关协议(IGP),用于在单一自治系统(AS)内决策路由。是对链路状态路由协议的一种实现,隶属内部网关协议(IGP),故运作于自治系统内部。著名的迪克斯加算法被用来计算最单路径树。OSPF支持负载均衡和基于服务类型的选路,也支持多种路由形式,如特定主机路由和子网路由等
6、ARP(地址解析协议)
可以把一个 IP 地址映射为 MAC 地址,RARP 是反向地址转换协议,通过 MAC 地址确定 IP 地址。
4、链路层
MAC:媒体访问控制
CSMA:载波侦探多路访问
CSMA/CD:载波侦听多路访问和碰撞检测
CSMA/CA:载波侦听多路访问/冲突避免
TCP和UDP区别
1、是否基于连接
- TCP是面向连接的协议
- UDP是无连接的协议
2、可靠性和有序性
- TCP可靠有序
- UDP不可靠,无序
3、实时性
- UDP实时性好
- TCP实时性差
4、协议首部大小
- TCP首部20字节
- UDP首部8字节
5、运行速度
- TCP运行速度慢
- UDP运行速度快
6、拥塞机制
- TCP有拥塞机制
- UDP没有拥塞机制
7、流模式(TCP)与数据报模式
- TCP视数据为字节流
- UDP视数据为报文
8、资源占用
- TCP占用资源多
- UDP占用资源少
协议格式
数据包封装
传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用 socket API 编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发送到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0eAey7AK-1626960266899)(https://i.loli.net/2021/04/13/RsvQrEuSKXfiUP1.jpg)]
不同的协议层对数据包有不同的称谓,在
传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)
。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用成数据交给应用程序处理。
1、以太网帧格式
以太网的帧格式如下所示:
其中的源地址和目的地址是指网卡的硬件地址(也叫
MAC地址
),长度是48位,是在网卡出厂时固化的。可在 shell 中使用 ifconfig 命令查看,“HWaddr 00:15:F2:14:9E:3F” 部分就是硬件地址。协议字段有是三种值,分别对应 IP,ARP,RAPR。帧尾是 CRC 校验码。
以太网帧中的数据长度规定最小 46 字节,最大 1500 字节, ARP 和 RARP 数据包的长度不够 46 字节,要在后面不填充位。
最大值1500称为以太网的最大传输单元(MTU)
,不同的网络类型有不同的 MTU,如果一个数据包从以太网路由到拔号链路上,数据包长度大于拨号链路的 MTU,则需要对数据包进行分片(fragmentation)。ifconfig 命令输出中也有 “MTU:1500”。注意,
MTU这个概念指数据帧中有效荷载的最大长度,不包括帧头长度
。
2、ARP 数据报格式
在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP 协议就起到这个作用。源主机发出 ARP 请求,询问 “IP 地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播),目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个 ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中。
每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般时间为20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件。1100 0000 1010 1000 0000 0001 0000 0011 c0 a8 01 03
ARP 数据报的格式如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KLrpMUQY-1626960266901)(https://i.loli.net/2021/04/13/D5EBfkAxuW1p87z.png)]
源MAC地址,目的MAC地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1 为以太网,协议类型指要转换的地址类型,0x0800 为 IP 地址,后面两个地址长度对于以太网地址和 IP 地址分别为 6 和 4(字节),op字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。
3、IP 数据报格式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QfGFnXWH-1626960266902)(https://i.loli.net/2021/04/13/FlsPHqjzUOic2Kb.jpg)]
IP 数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。
对于 IPv4,4 位版本字段是 4。4位首部长度的数值是以 4 字节为单位的,最小值为 5,也就是说首部长度最小是 4*5=20 字节,也就是不带任何选项的 IP 首部,4 为能表示的最大值是 15,也就是说首部长度最大是 60 字节。8 位 TOS 字段有 3 个位用来指定 IP 数据报的优先级
(目前已经放弃不用),还有 4 个位表示可选的服务类型(最小延迟,最大吞吐量,最大可靠性,最小成本),还有一个位总是 0.总长度是整个数据报(包括 IP 首部和 IP 层 payload)的字节数。每传一个 IP 数据报,16 位的标识加 1,可用于分片和重新组装数据报。3 位标志和 13 位片偏移用于分片。TTL(Time to live) 是这样用的:源主机为数据包设定一个生存时间,比如 64,每过一个路由器就把该值减 1,如果减到 0 就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存周期的单位不是秒,而是跳(hop)。==协议字段指示上层协议是 TCP,UDP,ICMP还是 IGMP。然后是校验位,只校验首部,数据的校验由更高协议负责。IPv4 的 IP 地址长度为 32 位。
4、UDP 数据报格式
5、TCP 格式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7yzEQ3G-1626960266903)(https://i.loli.net/2021/04/13/rTbd4hKVgCLJ5ev.jpg)]
与UDP协议一样也有源端口号和目的端口号,通讯双方由 IP 地址和端口号标识。32 位序号,32位确认序号。4 位首部长度和 IP 协议头类似,表示 TCP 协议头的长度,以 4 字节为单位,因此 TCP 协议头最长可以是 4*15=60 字节,如果没有选项字段,TCP 协议头最短 20 字节。URG,ACK,PSH,RST,SYN,FIN 是六个控制位。16 位校验和将 TCP 协议头和数据都极端在内。
TCP 协议
1、TCP 协议
1、简介
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lglAsnhu-1626960266904)(https://i.loli.net/2021/04/13/wIUAzgbuy9cOVsj.png)]
1、序列号seq
占 4 个字节,用来标记数据段的顺序,TCP 把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq 就是这个报文段中的第一个字节的数据编号。
2、确认号ack
占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
3、确认ACK
占1位,仅当 ACK = 1时,确认号字段才有效。ACK = 0 时,确认号无效。
4、同步SYN
连接建立时用于同步序号。当 SYN = 1,ACK = 0 时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN = 1 表示这是一个连接请求,或连接接受报文。SYN 这个标志位只有在 TCP 建立连接时才会被置 1,握手完成后SYN 标志位被置0.
5、终止FIN
用来释放一个连接。FIN = 1 表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接
PS:ACK,SYN,FIN这些大写的单词表示标志位,其值要么是 1,要么是 0;ack,seq 小写的单词表示序号。
字段 | 含义 |
---|---|
CWR | 拥塞窗口(发送方降低它的发送速率) |
ECE | ECE回显(发送方接收到了一个更早的拥塞通告) |
URG | 紧急指针是否有效。为1,表示某一位需要被优先处理 |
ACK | 确认号是否有效,一般置为1 |
PSH | 提示接收端应用程序立即从TCP缓冲区把数据独奏 |
PST | 对方要求重新建立连接,复位 |
SYN | 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1 |
FIN | 希望断开连接 |
2、TCP 选项
每一个SYN可以含有多个TCP 选项。下面是常用的TCP选项。
1、MSS选项
发送 SYN 的 TCP 一端使用本地选项通告对端它的最大分节大小(MSS),也就是它在本连接的每个 TCP 分节中愿意接受的最大数据量。发送端 TCP 使用接收端的 MSS 值作为多发送分节的最大大小。
2、窗口规模选项
TCP 连接任何一端能够通告对端的最大窗口大小是 65535,因此在 TCP 首部中相应的字段占 16 位。然而当今因特网的飞速发展,要求有更大的窗口以获得尽可能大的吞吐量。这个新选项指定 TCP 首部中的通告窗口必须扩大(即左移)的位数(0~14),因此所提供的最大窗口接近 1 GB(65535*214)。在一个 TCP 连接上使用窗口规模的前提是它的两个端系统必须支持这个选项。
为提供与不支持这个徐哪像的较早实现间的互操作性,需应用如下规则。TCP 可以作为主动打开的部分内容随它的 SYN 发送该选项,但是只在对端也随它的 SYN 发送该选项的前提下,它才能扩大自己窗口的规模。类似地,服务器的 TCP 只有接收到随客户的 SYN 到达的该选项时,才能发送该选项。本逻辑假定实现忽略它们不理解的选项,如此忽略是必需的要求,也已普遍满足,但无法保证所有实现都满足此要求。
3、时间戳选项
这个选项对于高速网络连接时必要的,它可以防止由失而复现的分组可能造成的数据损坏。它是一个较新的选项,也以类似于窗口规模选项的方式协商处理。作为网络编程人员,我们无需考虑这个选项。
TCP 的大多数实现都支持这些常用选项。后两个选项有时称为 “RFC1323选项”,因为它们是在 RFC 1323 中说明的。既然高带宽或长延迟的网络被称为 ”长胖管道“,这两个选项也成为 “长胖管道选项”。
3、TCP 通信时序
下图试一次 TCP 通讯的时序图。TCP 连接建立断开。包含大家熟知的
三次握手
和
四次挥手
。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hV7PRwxf-1626960266905)(https://i.loli.net/2021/04/13/hUSJaIG7YwgOnop.png)]
在这个例子中,首先客户端主动发起连接,发送请求,然后服务器端相应请求,然后客户端主动关闭连接。两条数显表示通讯的两端,从上到下表示时间的先后顺序,注意,数据从一段传到网络的另一端也需要时间,所以图中的箭头都是斜的。双方发送的段按时间顺序编号为 1-10,各段中的主要信息也在箭头上标出,例如段 2 的箭头标着 SYN,8000(0),ACK1001,表示该段中的 SYN 位置1,32位序号是 8000,该段不携带有效载荷(数据字节数为0),ACK位置1,32位确认序号是1001,带有一个mss(最大报文长度)选项值为1024。
1、建立连接(三次握手)的过程
2、数据传输的过程
-
客户端发出段4,包含从序号1001开始的20个字节数据。
-
服务器发出段 5,确认序号为 1021,对序号为 1001-1020 的数据表示确认收到,同时请求发送序号1021开始的数据,服务器在应答的同时也向客户端发送序号 8001 开始的 10 个字节数据,这称为 piggyback。
-
客户端发出段 6 ,对服务器发来的序号为 8001-8010 的数据表示确认收到,请求发送序号 8011 开始的数据。
在数传授过程中,ACK和确认序号非常重要,应用程序交给 TCP 协议发送的数据会暂存在 TCP 层的发送缓冲区中,发送数据包给对方之后,只有收到对方应答的 ACK 段才知道该数据包确实发到了对方,可以从发送缓冲区中释放掉,如果因为网络故障丢失了数据包或者丢失了对方发回的 ACK 段,经过等待超时后 TCP 协议自动发送缓冲区中的数据包重发。
3、关闭连接(四次握手)的过程
4、滑动窗口(TCP 流量控制)
提出原因
如果发送端发送的速度较快,接收端接收到数据后处理的速度较慢,而接收缓冲区的大小是固定的,就会丢失数据。
解决方案
TCP 协议通过 ”滑动窗口“机制解决这一问题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VihyyR14-1626960266906)(https://i.loli.net/2021/04/13/sE2SIeop63ZjYhR.png)]
-
发送端发起连接,声明最大段尺寸是 1460,初始序号是 0,窗口大小是 4k,表示 “我的接收缓冲区还有4k字节空闲,你发的数据不要超过 4k“。接收端应答连接请求,声明最大段尺寸是 1024,初始序号是 8000,窗口大小是 6k。发送端应答,三方握手结束。
-
发送端发出段 4-9,每个段带 1k 的数据,发送端根据窗口大小知道接收端的缓冲区满了,因此停止发送数据。
-
接收端的应用程序提走 2k 数据,接收缓冲区又有了 2k 空闲,接收端发出段 10,在应答已收到 6k 数据的同时声明窗口大小为 2k。
-
接收端的应用程序有提走 2k 数据,接收缓冲区有 4k 空闲,接收端发出段 11,重新声明窗口大小为 4k。
-
发送端发出段 12-13,
每个段带 2k 数据
,段 13 同时还包含 FIN 位。 -
接收端应答接收到的 2k 数据 (6145-8192),再加上 FIN 位占一个序号 8193,因此应答序号是 8194,连接处于半关闭状态,接收端重新声明窗口大小为 2k。
-
接收端的应用程序提走 2k数据,接收端重新声明窗口大小为 4k。
-
接收端的应用程序提走剩下的 2k 数据,接收缓冲区全空,接收端重新声明窗口大小为 6k。
-
接收端的应用程序在提走全部数据后,决定关闭连接,发出段 17 包含 FIN 位,发送端应答,连接完全关闭。
上图在接收端用小方块表示 1k 数据,实心的小方块表示已接收到的数据,虚线框表示接收缓冲区,因此套在虚线框中的空心小方块表示窗口大小,从图中可以看出,随着应用程序提走数据,虚线是向右滑动的,因此称为滑动窗口。
从这个例子还可以看出,发送端是按 1k 发送数据,而接收端的应用程序可以 2k 地提走数据,方然也有可能一次提走 3k 或 6k 数据,或者一次只提走几个字节的数据。也就是说,应用程序所看的数据是一个整体,或者说是一个流(stream),在底层通讯中这些数据可能被拆成很多数据包来发送,但是一个数据包有多少字节对应用程序是不可见的,因此 TCP 协议 是面向流的协议。而 UDP 是面向消息的协议,每个 UDP 段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和 TCP 是很不同的。
5、状态转换总体概述
TCP 涉及连接建立和连接终止的操作可以用状态转换图来说明。
TCP 为一个连接定义了 11 种状态,并且 TCP 规则规定如何基于当前状态及在该状态下所接收的分节从一个转换到另一个状态。举例来说,当某个应用进程在 CLOSED 转态下执行主动打开时,TCP 将发送一个 SYN,且新的状态时 SYN_SENT。如果这个 TCP 接着接收到一个带 ACK 的 SYN,它将发送一个 ACK,且新的状态是 ESTABLISHED。这个最终状态是绝大多数数据传送发生的状态。
如果某个应用进程在接收到一个 FIN 之前调用 close(主动关闭),那就转换到 FIN_WAIT_1 状态,但如果某个应用进程在 ESTABLISHED 状态期间接收到一个 FIN(被动关闭),那就转换到 CLOSE_WAIT 状态。
注意:还有两个我么未曾讨论的转换:一个位同时打开,发生在两端几乎同时发送 SYN 并且这两个 SYN 在网络交错的情形下,另一个同时关闭,发生在两端几乎同时发送 FIN 的情形下,他们是可能发生的,不
过非常罕见。
1、CLOSED:表示初始状态
LISTEN:该状态表示服务器端的某个 SOCJET 处于监听状态,可以接受连接。
2、SYN