【Linux网络编程】Socket编程:协议理论入门
前言
首先,在学习Socket编程之前,我们应该了解关于网络的一些基本概念,虽然说没有这些理论概念并不影响编程,但是以后工作时扯扯皮还是有用的。而且,一个开发网络程序的人不知道网络领域的一些基本概念,这说不过去。
然后,介绍一下什么是Socket编程,显然,在Linux文件分类时,socket是文件类型的一种,叫做套接字文件,套接字文件主要是用于网络通信使用的。
如果是在本机,也就是同一台电脑上,我们可以使用进程间通信,如:文件、管道、消息队列等,让两个程序进行数据的交换。但是如果是两台电脑,我们就没法使用这些途径进行数据的交互了。此时网络通信就应运而生,而且,现在除了一些譬如单机游戏下载到本地直接使用的软件,其它很多app全部都需要使用网络通信。
但是,为了通信,双方得互相理解。比如:A的认知里红色就是红色,但是在红绿色盲B的认知里就不是的。AB理解不了对方,那么就没法进行正常的沟通,此时就需要制作一定的规则,让它们两个能正常交流。
所以,网络第一篇:协议!
协议的基本概念
协议:本质就是一组规则,用来规定传输方和接收方,对数据格式以及传输格式的约束。
例如,现在有一个协议:
传过来的数据中,传输方必须先传输一个“消息长度”信息给对方;而接收方,此时也必须将这次的数据解析为“消息长度”,并且准备好接收这么长的数据。
接下来,传输方必须传输一个“消息类型”信息给对方;而接收方,此时也必须将这次的数据解析为“消息类型”,并且判断这个消息类型是什么,并作出相应的处理。
最后,传输方必须传输一个“消息内容”信息给对方;而接收方,此时就必须将这次的数据解析为“消息内容”,并且根据决定好的处理,来处理这段数据内容。
除了对这个传输过程的规定,传输的数据、内容的格式也要遵循一定的协议,例如:Json格式消息内容、XML格式的消息内容等等
仅仅用于两者之间通信的协议被称为原始协议,当这个协议被更多的人知道、使用、不断增加改进维护完善,那么最终会形成一个稳定的,完整的协议,被广泛的应用于各通信过程中。这个协议就称为一个标准协议。
我们常见的TCP协议、UDP协议、HTTP协议就是标准协议。
思考:
a)如果A端采用TCP协议,而B端采用UDP协议,那么AB能通信吗?【不能】
b)为什么不能?它们不都遵循协议规则了嘛?【因为只有遵循同种规则的双方才能通信】
eg. 举个栗子:A是火星人,火星文;B是地球人,说本土语言。A、B能交流吗?显然不行,要么专门为两者指定各自配备翻译器,要么让其中一方换成对方的语言进行交流。
典型协议介绍
网络协议(Protocol)是一种特殊的软件,是计算机网络实现其功能的最基本机制。但网络协议不是一套单独的软件,它融合于其它所有软件系统中,因此,协议在网络中随处可见。从顶层软件,到底层硬件,每一层都遵循一定的协议规则。
TCP:Transmission Control Protocol,传输控制协议。是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP:User Datagram Protocol,用户数据报协议。是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
HTTP:Hyper Text Transfer Protocol,超文本传输协议。是互联网上应用最为广泛的网络协议。
FTP:File Transfer Protocol,文件传输协议。早期的邮件传输就是采用该协议。
IP:Internet Protocol,因特网互联协议。
ICMP:Internet Control Message Protocol,因特网控制报文协议。是TCP/IP协议族的一个子协议,用于IP主机、路由器之间传递控制消息。
IGMP:Internet Group Management Protocol,因特网组管理协议。因特网协议家族中的一个组播协议,该协议运行在主机和组播路由器之间。
ARP:Address Resolution Protocol,正向地址解释协议。通过已知的IP,寻找对应主机的MAC地址【媒体访问控制地址,也称为LAN局域网地址】
RARP:反向地址转换协议。通过MAC地址确定IP地址。
对于普通用户而言,不需要关心太多的底层通信协议,只需要了解其通信原理即可。在实际管理中,底层通信协议一般会自动工作,不要人工干预。但对于第三层以上的协议就经常需要人工 干预了,比如:TCP/IP协议等。
提到这里,那就免不了要将网络通信划分为几个层次:
分层模型
最标准的莫过于OSI(Open System Interconnection)七层模型了。
首先将七层模型给出来:【物数网传会表应】
分别是:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
附图:
《了解内容》
⚪物理层:负责处理物理介质上的信号传输。该层协议定义了物理设备的电气、机械、功能、规程特性,确保数据能够在物理介质上进行传输。
⚪数据链路层:负责将物理层的信号转化为数据帧,并进行错误检测与纠正。该层还负责在相邻节点之间进行数据帧的传输和流量控制,确保数据的可靠传输。
⚪网络层:负责将数据从源节点传输到目标节点,通过路由选择算法确定数据传输的路径。他还处理网络地址、子网划分等问题。实现不同网络之间的互联。
⚪传输层:为应用程序提供端到端的通信服务,确保数据的可靠传输和顺序交付。它通过端口号来区分不同的应用程序,并提供流量控制,差错控制等功能。
⚪会话层:负责建立、维护和管理会话,在不同主机上的应用程序之间进行会话同步和协调。它还提供了会话恢复、会话终止等功能。
⚪表示层:对数据进行转换、加密和解密、压缩与解压等处理,确保不同系统之间能够正确地理解和处理数据。
⚪应用层:直接为用户提供服务,包括各种网络应用程序,如HTTP协议、SMTP协议、DNS域名系统等。
但是这么分实在是太细了,很多协议模型在实现时,都不会一一遵循这个参考模型。我们常用的是TCP/IP的四层模型。
一样的,先给出四层模型:【链网传应】
分别是:链路层、网络层、传输层、应用层。
(链路层也成为网络接口层,是底层为网络层提供接口的层)
下面给出TCP/IP模型以及对照的OSI参考模型:

我们可以看到,TCP/IP四层模型是将OSI七层模型的:
应用层、表示层、会话层归为了应用层;传输层对应传输层;网络层对应网络层;链路层对应了数据链路层与物理层。
《下面给出各层需要了解的一些协议》
应用层:HTTP协议;ftp、nfs、ssh、telent......
传输层:TCP协议、UDP协议;......
网络层:IP协议;ICMP协议、IGMP协议......
链路层:以太网帧协议、ARP协议、RARP协议......
【终点掌握红色部分的协议、其次了解橙色部分的协议、最后拓展其它协议】
分层的意义:解耦
通信过程解析【简易】
我们实际开发中常用的就是TCP/IP协议,那么我们就以四层模型来进行通信过程的解析。
以两台主机为例:
左侧为HostA,右侧为HostB。现在假设主机A要发送一封邮箱到主机B。
那么在主机A的应用层,将数据写到邮件里了。这个邮件会把要传输的数据Data封装为Data_v1。到传输层时,传输层的协议就会把这个数据进行封装,得到数据Data_v2,到了网络层,网络层的协议会把Data_v2封装成Data_v3,然后来到链路层,数据又封装一层Data_v4。最后将Data_v4这个数据转化为电气特性(例如:0-1串 转化为 强弱电信号,这个过程也称为数模转换)经过光纤等介质传输到网络环境中,经过路由算法,找到目标机器的地址,然后将数据传过去。
当数据传输到主机B上时,在主机B遵循与A同一套协议的情况下, 就可以将电气特性转化为数据Data_v4(如将 强弱电信号转换为01串,这个过程也成为模数转换),这些数据来到了主机B的链路层,根据协议,将对方的数据解析出来得到Data_v3,经过网络层、传输层,依次解析出Data_v2,和Data_v1,来到应用层解析Data_v1得到了Data,这个Data就是主机B收到的最终数据,此时,邮件就发送到主机B了。
过程如图所示:
这个过程中的数据变化简单来讲就像图中所示,每次封装都会增加一次报头head。具体来讲,就跟每个协议的格式有关了,后文会有提及。
首先,我们将上述的过程中的数据变化过程中的数据变化列出来:
如图所示:
其中Appl首部可以是遵循一定的格式,也可以是自定义数据格式。
以太网帧协议格式
对于上述的这段内容,我们可能想知道,为什么就这么确定每段的长度就那么多?下面就解惑了:
1. 以太网尾部由一个循环冗余校验码CRC构成,一个int整型大小,4字节。
2. 以太网首部由目的地址、源地址、类型三部分构成:目的地址和源地址各占6字节,类型占2字节。
《为什么是 6 ?》
因为这个地址是MAC地址,下面是百度百科给的MAC地址定义:
MAC地址由48位二进制数(6个字节)组成,通常表示为12位十六进制数 [9],格式为XX-XX-XX-XX-XX-XX [8]。 如:00-16-EA-AE-3C-40就是一个MAC地址,其中前3个字节,16进制数00-16-EA代表网络硬件制造商的编号,它由 IEEE (电气与电子工程师协会)分配,而后3个字节,16进制数AE-3C-40代表该制造商所制造的某个网络产品 (如网卡)的系列号。
3. 为什么数据格式至少要有46字节?其中28字节代表ARP请求/应答,或者RARP请求/应答;18字节代表PAD。
以太网帧数据格式:示意图↘
这块大家可以自己了解一下,涉及到接近硬件的知识(ARP、RARP协议)等内容。对于我而言,只了解到大概的有这么个格式。
感谢大家!!