1.写在前面
论坛和小组中经常有技术同行计划自己开发即时消息或消息推送系统。通常,他们不了解基本的网络编程理论(如网络协议),所以他们匆忙制定计划和编写代码,这是非常盲目的,充满了技术风险。
在即时通讯网络论坛上,出现了一系列关于网络编程的文章,如“[浅显易懂]深入理解TCP协议”、“未知网络编程”、“详细P2P技术”、“高性能网络编程”,甚至还有图文结合实战代码的“NIO框架简介”等。虽然材料很好,但许多同龄人可能时间紧迫或心态浮躁。无论如何,他们就是不能冷静下来仔细学习,这导致了很多必须掌握的网络编程知识库的缺失(如果你打算从头开始开发移动即时通讯,建议你从“初学者入门:从头开发移动即时通讯”开始)。
这一系列的文章(总共3篇)将为你(尤其是上面提到的冲动的开发者)提供一个对懒惰的人的快速介绍。我希望你能在不能耐心阅读以上系列文章的情况下,理解并掌握基本的网络编程知识(但强烈建议你先阅读),从而对你的即时通讯系统或消息推送系统的技术选择、方案制定和代码编写起到理论支持作用。
本文将从网络通信协议入手,懒人,动_!
2.文本简介
我们每天都使用互联网。你想过它是如何实现的吗?
世界上数十亿台计算机相互连接和通信。上海的某个网卡发出了信号,但洛杉矶的另一个网卡实际上收到了信号。事实上,他们根本不知道对方的地理位置。你不觉得这很神奇吗?
互联网的核心是一系列协议,统称为“互联网协议套件”。他们对如何连接和联网计算机制定了详细的规定。通过理解这些协议,我们可以理解互联网的原理。
这是我的学习笔记。因为这些协议太复杂和庞大,我想安排一个简单的框架来帮助我把它们作为一个整体来理解。为了便于理解,我做了许多简化。有些地方不全面也不准确,但我应该能清楚地解释互联网的原理。
此外,如果您对承载这些网络协议的物理设备的工作方式感到好奇,您可以先阅读“网络编程惰性简介(VI):历史上最流行的集线器、交换机和路由器功能原理简介”。
3.系列文章
本文是一系列文章中的第一篇,其概要如下:
惰性网络编程导论(一):快速理解网络通信协议(第一部分)(本文)
惰性网络编程导论(二):网络通信协议的快速理解(下)
网络编程中的懒人介绍(3):快速理解TCP协议就足够了
网络编程中的懒人介绍(4):快速理解TCP和UDP的区别
网络编程中的懒人入门(5):快速理解为什么UDP有时优于TCP
网络编程中的懒人介绍(6):历史上最流行的集线器、交换机和路由器的功能原理介绍
网络编程中的懒人介绍(7):用简单的方式理解HTTP协议
网络编程中的懒人介绍(8):教你写基于TCP的套接字长连接。
网络编程中的懒人介绍(9):通俗的解释,当你有IP地址的时候为什么要用MAC地址?》
网络编程中的懒人入门(10):泡在尿里的时候,快速理解quic协议
网络编程中的懒人入门(11):在一篇文章中了解什么是IPv6
懒惰网络编程入门(12):快速阅读Http/3协议,一个就够了!》
本网站的“脑障网络编程入门”也适合入门学习。该系列的概要如下:
脑残网络编程导论(1):学习TCP三次握手和四波动画
脑残网络编程导论(2):读写套接字时,我们在读什么和写什么?》
脑残网络编程导论(3):对超文本传输协议的一些必要知识
脑残网络编程导论(4):对HTTP/2服务器推送的快速理解
如果你认为这一系列文章太基础,你可以直接阅读“未知网络编程”系列文章。该系列的目录如下:
未知网络编程(一):TCP协议中的疑难问题分析(上)
未知网络编程(二):TCP协议中的疑难问题分析(下)
未知的网络编程(3):为什么在关闭TCP连接时要等待时间和关闭等待时间
未知网络编程(4):深入研究和分析TCP异常关机
未知网络编程(5): UDP连接和负载平衡
未知网络编程(ⅵ):深入理解UDP协议并充分利用它
未知网络编程(七):如何使不可靠的UDP可靠?》
未知网络编程(8):从数据传输层深度解密HTTP
未知网络编程(九):理论联系实际,全方位理解域名系统
有关移动网络的特性和优化方法的摘要文章,请参见:
现代移动网络短连接优化方法综述:请求速度、弱网络适应和安全保障
“移动即时消息开发人员必须阅读(1):易于理解,理解移动网络的“弱”和“慢”
移动即时消息开发者必须阅读(2):历史上最全面的移动弱网络优化方法总结
4.参考
TCP/IP的详细说明-第11章UDP:用户数据报协议
TCP/IP的详细说明-第17章TCP:传输控制协议
TCP/IP的详细说明-第18章TCP连接的建立和终止
TCP/IP的详细说明-第21章TCP的超时和重传
易于理解——对TCP协议的深刻理解(一):理论基础
易于理解——对TCP协议的深刻理解(ⅱ): RTT,滑动窗口,拥塞处理
理论经典:三次握手和四波TCP协议详解
理论与实践相结合:无线鲨鱼对TCP三握手四波的数据包捕获分析
计算机网络通信协议图(中文版)
高性能网络编程(一):一台服务器可以有多少个并发的TCP连接
高性能网络编程(二):十年来著名的C10K并发连接问题
高性能网络编程(3):在未来10年,是时候考虑C10M的并发问题了
高性能网络编程(四):从C10K到C10M的高性能网络应用的理论探索
简单介绍了TCP和UDP的区别
为什么QQ使用UDP而不是TCP?》
“移动即时消息协议选择:UDP还是TCP?》
5.内容概述
5.1五层模型
互联网的实现分为几个层次。每一层都有自己的功能,就像一座建筑,每一层都由下一层支撑。用户只触摸顶层,根本感觉不到底层。要理解互联网,我们必须从底层开始,从底层到顶层理解每一层的功能。
关于如何划分层有不同的模型,其中一些被分成七层,而其他的被分成四层。我认为把互联网分成五层更容易解释:
网络编程中的懒人介绍(1):快速理解网络通信协议(第一部分)_1.jpg
如上图所示,底层称为物理层,顶层称为应用层,中间三层(自下而上)为链路层、网络层和传输层。层越低,越靠近硬件;图层越高,离用户越近。
他们的名字并不重要。只要知道互联网分为几个层次。
5.2层和协议
每一层都是为完成一项功能而设计的。为了实现这些功能,每个人都必须遵守共同的规则。每个人都遵守的规则叫做“协议”。
互联网的每一层都定义了许多协议。这些协议统称为“互联网协议套件”。他们是互联网的核心。下面介绍每一层的功能,主要介绍每一层的主要协议。
6.实体层
让我们从底层开始。
当电脑联网时,第一件事是什么?当然,首先应该连接计算机,可以使用光缆、电缆、双绞线和无线电波。
网络编程中的懒人介绍(一):快速理解网络通信协议(一)_2
这被称为“实体层”,它是连接计算机的物理手段。它主要定义网络的一些电气特性,并负责传输0和1电信号。
7.链路层
7.1定义
简单的0和1没有意义,所以有必要指定解释方法:多少电信号被算作一组?每个信号位的含义是什么?
这是“链路层”的功能,它位于“实体层”之上,并确定分组模式0和1。
7.2以太网协议
在早期,每家公司都有自己的电信号分组方式。渐渐地,一种叫做“以太网”的协议占据了主导地位。
以太网规定一组电信号构成一个数据包,称为“帧”。每帧分为两部分:标题和数据。
网络编程中的懒人介绍(一):对网络通信协议的快速理解(一)
“报头”包含数据包的一些描述项,如发送方、接收方、数据类型等。“数据”是数据包的具体内容。
“头”的长度固定为18字节。“数据”的长度,最短是46字节,最长是1500字节。因此,整个“帧”的最小长度为64字节,最大长度为1518字节。如果数据很长,必须分成多个帧进行传输。
7.3MAC地址
如上所述,以太网数据包的“报头”包含发送方和接收方的信息。那么,如何识别发送者和接收者呢?
以太网规定所有连接到网络的设备必须有一个“网卡”接口。数据包必须从一个网卡传输到另一个网卡。网卡的地址是数据包的发送地址和接收地址,称为媒体访问控制地址。
网络编程中的懒人介绍(一):对网络通信协议的快速理解(一)
当每个网卡出厂时,它在世界上有一个唯一的MAC地址,长度为48个二进制位,通常由12个十六进制数表示。
网络编程中的懒人介绍(一):对网络通信协议的快速理解(一)
前六个十六进制数是制造商号,后六个是制造商网卡的序列号。使用媒体访问控制地址,您可以找到网卡和数据包的路径。
7.4广播
定义地址只是第一步,还有更多步骤要遵循:
1)首先:一个网卡如何知道另一个网卡的媒体访问控制地址?
答案是有一个ARP协议可以解决这个问题。这将在后面描述。只需知道以太网数据包在发送前必须知道接收方的媒体访问控制地址。
2)其次,即使有了媒体访问控制地址,系统如何才能准确地将数据包发送到接收方?
答案是以太网采用了非常“原始”的方式。它不是准确地将数据包发送给接收者,而是将它们发送给网络中的所有计算机,这样每台计算机都可以判断它是否是接收者。
网络编程中的懒人介绍(一):对网络通信协议的快速理解(一)
上图中,1号计算机向2号计算机发送数据包,同一子网中的3号、4号和5号计算机将收到该数据包。他们读取数据包的“报头”,找到接收方的媒体访问控制地址,然后将其与自己的媒体访问控制地址进行比较。如果它们是相同的,它们将接受该数据包进行进一步处理,否则,它们将丢弃该数据包。这种传输方式被称为“广播”。
通过定义数据包、网卡的媒体访问控制地址和广播的发送方式,“链路层”可以在多台计算机之间传输数据。
8.网路层
8.1网络层的起源
以太网协议,依靠媒体访问控制地址发送数据。从理论上讲,上海的网卡仅依靠MAC地址就能找到洛杉矶的网卡,这在技术上是可以实现的。
然而,这有一个主要的缺点。以太网通过广播发送数据包,所有成员都有一个“数据包”,这不仅效率低下,而且仅限于发送方所在的子网。也就是说,如果两台计算机不在同一个子网中,就不能传输广播。这个设计是合理的,否则互联网上的每一台计算机都会收到所有的软件包,这将导致灾难。
互联网是由众多子网络组成的巨大网络。几乎不可能想象上海和洛杉矶的计算机会在同一个子网中。
网络编程中的懒人介绍(一):快速理解网络通信协议(一)
因此,我们必须找到一种方法来区分哪些MAC地址属于同一个子网,哪些不属于。如果是同一个子网,将通过广播发送,否则将通过“路由”发送。(“路由”是指如何将数据包分发到不同的子网,这是一个很大的话题,本文不涉及。不幸的是,MAC地址本身不能做到这一点。它只与制造商有关,与网络无关。
这导致了“网络层”的诞生。它的功能是引入一组新的地址,这样我们就可以区分不同的计算机是否属于同一子网。这组地址称为“网络地址”。
因此,在“网络层”出现后,每台计算机都有两种地址,一种是媒体访问控制地址,另一种是网络地址。这两个地址之间没有联系。MAC地址绑定到网卡,网络地址由管理员分配。它们只是随机组合的。
网络地址帮助我们识别计算机所在的子网,而MAC地址将数据包发送到子网中的目标网卡。因此,可以从逻辑上推断出必须首先处理网络地址,然后必须处理媒体访问控制地址。
8.2IP协议
指定网络地址的协议称为IP协议。它定义的地址称为IP地址。目前,被称为IPv4的第四版IP协议被广泛使用。
在此版本的IPv4中,网络地址由32个二进制位组成:
网络编程中的懒人介绍(一):对网络通信协议的快速理解(一)
传统上,我们使用四个十进制数来表示IP地址,从0.0.0.0到255.255.255.255。
互联网上的每台计算机都将被分配一个IP地址。这个地址分为两部分,前一部分代表网络,后一部分代表主机。例如,IP地址172.16.254.1是一个32位地址。假设其网络部分是前24位(172.16.254),主机部分是后8位(最后一位)。同一子网中的计算机的IP地址必须具有相同的网络部分,这意味着172.16.254.2应该与172.16.254.1在同一子网中。
然而,问题是我们不能仅仅从IP地址来判断网络部分。以172.16.254.1为例。无论网络部分是前24位、前16位还是前28位,都不能从IP地址中看到。
那么,我们如何从IP地址判断两台计算机是否属于同一子网呢?这需要另一个参数“子网掩码”。
所谓的“子网掩码”是一个代表子网特征的参数。它在形式上相当于IP地址,也是一个32位二进制数。它的网络部分都是1,它的主机部分都是0。例如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,则子网掩码是11111111111 . 11111111 . 000000,十进制数是255.255.255.0。
知道了“子网掩码”,我们就可以判断任意两个IP地址是否在同一个子网中。方法是对两个IP地址和子网掩码分别进行“与”运算(两位数字都是1,运算结果为1,否则为0),然后比较结果是否相同,如果相同,则表示它们在同一个子网中,否则不相同。
例如,已知172.16.254.1和172.16.254.233的子网掩码为255.255.255.0。他们在同一个子网吗?使用子网掩码进行与运算的结果是172.16.254.0,因此它们位于同一子网中。
总而言之,IP协议有两个主要功能,一个是为每台计算机分配IP地址,另一个是确定哪些地址在同一个子网中。
8.3数据包
根据IP协议发送的数据称为IP数据包。不难想象它必须包含IP地址信息。但是,如前所述,以太网数据包只包含媒体访问控制地址,没有IP地址字段。那么,您是否需要修改数据定义并添加另一个字段?
答案是否定的,我们可以将IP数据包直接放入以太网数据包的“数据”部分,因此根本不需要修改以太网规范。这就是互联网层级结构的优势:上层的变化根本不涉及下层的结构。
具体来说,IP数据包也分为两部分:报头和数据:
网络编程中的懒人介绍(一):快速理解网络通信协议(一)
“报头”部分主要包括版本、长度、IP地址等信息,而“数据”部分是IP数据包的具体内容。在它被放入以太网包之后,以太网包变成这样:
网络编程中的懒人介绍(1):快速理解网络通信协议(第一部分)_10.jpg
IP数据包的“报头”部分的长度为20到60字节,整个数据包的最大总长度为65,535字节。因此,理论上,IP数据包的“数据”部分长达65,515字节。如前所述,以太网数据包的“数据”部分最多只有1500字节。因此,如果IP数据包超过1500字节,则需要将其分成几个以太网数据包,并分别发送。
8.4ARP协议
关于“网络层”,还有最后一点。因为IP包是在以太网包中发送的,所以我们必须同时知道两个地址,一个是对方的MAC地址,另一个是对方的IP地址。通常,对方的IP地址是已知的(这将在后面解释),但我们不知道它的MAC地址。
因此,我们需要一种机制来从IP地址获取MAC地址。
这里可以分为两种情况:
1)第一种情况:如果两台主机不在同一个子网中,实际上没有办法得到另一方的MAC地址,数据包只能传输到两个子网交界处的“网关”进行网关处理;
2)第二种情况:如果两台主机在同一个子网中,那么我们可以使用ARP协议来获取对方的MAC地址。ARP协议还发送一个数据包(包含在以太网数据包中),其中包含它要查询的主机的IP地址。在另一方的媒体访问控制地址栏中,表示它是一个“广播”地址。子网中的每台主机都会收到该数据包,取出其IP地址,并与自己的IP地址进行比较。如果它们是相同的,它们都会回复并向对方报告它们的MAC地址,否则,数据包将被丢弃。
总之,使用ARP协议,我们可以获得同一子网中主机的MAC地址,并将数据包发送到任何主机。
9.传输层
9.1传输层的起源
有了MAC地址和IP地址,我们可以在互联网上的任何两台主机上建立通信。
下一个问题是同一台主机上有许多程序需要使用网络。例如,你在网上和朋友聊天时浏览网页。当数据包从互联网发送时,您如何知道它是代表网页内容还是在线聊天内容?
也就是说,我们还需要一个参数来指示这个包用于哪个程序(进程)。该参数称为“端口”,实际上是每个使用网卡的程序的数量。每个数据包都被发送到主机的特定端口,因此不同的程序可以获得它们需要的数据。
“端口”是0到65535之间的整数,正好是16个二进制位。从0到1023的端口被系统占用,用户只能选择大于1023的端口。无论是浏览网页还是在线聊天,应用程序都会随机选择一个端口,然后联系服务器的相应端口。
传输层的功能是建立端口到端口的通信。相比之下,“网络层”的功能是建立“主机到主机”的通信。只要确定了主机和端口,我们就可以实现程序之间的通信。因此,Unix系统调用主机+端口“套接字”。有了它,你可以开发网络应用。
9.2UDP协议
现在,我们必须将端口信息添加到数据包中,这需要新的协议。最简单的实现称为UDP协议,它的格式几乎在数据之前,加上端口号。
UDP数据包也由“报头”和“数据”组成:
网络编程中的懒人介绍(一):对网络通信协议的快速理解(一)
“头”部分主要定义发送端口和接收端口,“数据”部分是具体内容。然后,将整个UDP数据包放入IP数据包的“数据”部分,如前所述,IP数据包放入以太网数据包,因此整个以太网数据包现在如下:
网络编程中的懒人介绍(一):快速理解网络通信协议(一)_12
UDP包非常简单,“头”部分总共只有8个字节,总长度不超过65,535字节,正好适合一个IP包。
9.3TCP协议
UDP协议的优点是简单易实现,缺点是可靠性差。一旦数据包被发送,就不可能知道对方是否已经收到它。为了解决这个问题,提高网络的可靠性,TCP协议应运而生。该协议非常复杂,但可以近似认为是带有确认机制的UDP协议,它要求对发送的每个数据包进行确认。如果数据包丢失,则不会收到确认,发送方知道有必要重新发送数据包。
因此,TCP协议可以确保数据不会丢失。其缺点是过程复杂、实施困难、资源消耗高。
与UDP数据包一样,TCP数据包也嵌入在IP数据包的“数据”部分。TCP数据包的长度没有限制,理论上可以无限长。然而,为了保证网络的效率,TCP包的长度通常不超过IP包的长度,从而保证单个TCP包不需要分割。
10.应用层
应用程序接收“传输层”的数据,然后解释它。因为互联网是一个开放的体系结构,并且数据源是多种多样的,所以必须预先指定格式,否则根本无法解释。应用层的作用是指定应用程序的数据格式。
例如,TCP可以为各种程序传输数据,如电子邮件、万维网、FTP等。然后,必须有不同的协议来指定电子邮件、网页和FTP数据的格式,并且这些应用协议构成了“应用层”。这是最高层次,直接面对用户。它的数据被放在TCP数据包的“数据”部分。
因此,当前以太网数据包如下:
网络编程中的懒人介绍(1):快速理解网络通信协议(第一部分)_13.jpg
11.本文摘要
至此,整个互联网的五层结构已经从下到上完成。这是对互联网如何形成的系统解释。接下来,“惰性网络编程介绍(二):网络通信协议的快速理解(第二部分)”,我依次从用户的角度,看看这种结构如何从上到下完成网络数据交换。请向前看!
(原始链接:点击这里进入,有变化)
附录:更多网络编程材料
技术过去:TCP/IP协议改变世界(珍贵的多画面,手机注意)
UDP中数据包的最大大小是多少?》
介绍Java新一代网络编程模型的AIO原理和Linux系统的AIO
NIO框架介绍(一):服务器端基于网络4的UDP双向通信演示
NIO框架介绍(2):服务器端基于MINA2的UDP双向通信演示
NIO框架介绍(3):iOS与MINA2和Netty4之间跨平台UDP双向通信的实战
NIO框架介绍(四):安卓与MINA2和网络4之间跨平台UDP双向通信的实战
P2P技术的详细说明(一):网络地址转换的详细说明——P2P的详细原理和介绍
P2P技术详解(二):P2P中的网络地址转换穿越(打洞)方案详解
P2P技术详细说明(3):P2P技术的STUN、TURN和ICE的详细说明
易于理解:快速理解P2P技术中的NAT穿透原理
> >更多类似的文章...
即时消息网络-即时消息开发者社区!来源:即时消息网络-即时消息开发者社区!
哇谷im_im即时通讯_私有云_公有云-哇谷云科技官网-JM沟通
IM下载体验 - 哇谷IM-企业云办公IM即时聊天社交系统-JM 沟通下载
IM功能与价格 - 哇谷IM-提供即时通讯IM开发-APP搭建私有化-公有云-私有化云-海外云搭建
新闻动态 - 哇谷IM-即时通讯热门动态博客聊天JM沟通APP
关于哇谷-哇谷IM-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建
联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务
IM云系统即时通讯公有云、私有云、企业云、海外云-哇谷IM团队
im即时通讯社交软件APP红包技术分析(五):微信红包、聊呗红包、诚信红包、高并发技术
公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?