目录
一、网络协议
1.网络协议概念
2.协议分层
3.OSI七层模型和TCP/IP五层(或四层)模型
4.为什么要有网络协议?
5.网络通信协议的原理
二、网络传输的根本流程
1.局域网的网络传输流程
1.MAC地址
2.局域网通信原理(以太网为例)
3.协议的封装和解包、分用
2. 跨网络传输流程图
1.IP地址
2.跨网络通信原理
编辑3.IP地址对比MAC地址
三、Socket编程预备知识
1.端口号Port
2.端口号和历程ID的区别
3.明白Socket
4.认识传输层中的范例协议
5.网络字节序
6.Socket编程接口
(1)创建 socket 文件形貌符(TCP/UDP, 客户端 + 服务器)
(2)绑定端口号 (TCP/UDP, 服务器)
(3)开始监听socket (TCP, 服务器)
(4)汲取请求 (TCP, 服务器)
(5)建立毗连 (TCP, 客户端)
(6)汲取数据(UDP,服务端)
(7)发送数据sendto
7.关于sockaddr结构体
(1)struct sockaddr_in
(2)struct sockaddr_un
一、网络协议
1.网络协议概念
计算机之间的传输前言是光信号和电信号,通过“频率”和“强弱”表示0或1。如果想要通报各种各样的信息,就要约定好两边通信信息的数据格式。
为了让不同厂商生产的计算机可以相互通畅地通信,就必要约定一个共同的通信尺度,全部人都要服从,这个共同的通信尺度就是网络协议。
2.协议分层
协议本质是一个软件,协议分层是为了实现解耦合,让软件维护资本更低。
例如下图:将协议分层为两层:语言层和通信设备层。以打电话为例,逻辑上是两个人在直接通信,但实际上是必要通过电话来传输信息,电话机之间依照的时电话间之间的协议,人与人之间依照的是汉语协议。
如果将电话机通信改为无线电通信,那么通信设备层之间依照的就是无线电协议;如果将汉语改为英语,那么语言层之间依照的就是英语协议。
实际上的网络通信协议设计地更复杂,必要分为更多层。
3.OSI七层模型和TCP/IP五层(或四层)模型
OSI七层模型是开放式体系互联参考模型, 是一个逻辑上的定义和规范。将网络通信协议从逻辑上分为了7层,但是实际实现时OSI七层模型比力复杂冗余,所以真正接纳的是TCP/IP五层(或四层)模型。TCP/IP五层(或四层)模型将OSI七层模型中的应用层、表示层和会话层合为一个层。又由于物理层思量的比力少,所以TCP/IP模型也叫做四层模型。
TCP/IP五层(或四层)模型是一组协议的代名词,它其中还包括很多其他协议,共同构成了TCP/IP协议簇。
- 物理层: 负责光/电信号的通报方式. 比如现在以太网通用的网线(双绞线)、早期以太网接纳的的同轴电缆 (现在紧张用于有线电视)、光纤, 现在的wifi无线网利用电磁波等都属于物理层的概念。物理层的本领决 定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
- 数据链路层: 负责设备之间的数据帧的传送和辨认. 例如网卡设备的驱动、帧同步(就是说从网线上检测 到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据不对校验等工作. 有以太 网、令牌环网, 无线LAN等尺度. 互换机(Switch)工作在数据链路层.
- 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规 划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 可以或许确保数据可靠的从源主机发送到目标 主机.
- 应用层: 负责应用程序间沟通,如简朴电子邮件传输(SMTP)、文件传输协议(FTP)、网络长途访问 协议(Telnet)等. 我们的网络编程紧张就是针对应用层
4.为什么要有网络协议?
起首,即使是一个计算机,其内部也存在各种协议,例如其他设备和内存之间的通信协议、其他设备和磁盘的通信协议等。而网络协议是为相识决计算机之间的通信,其存在的本质原因是通信距离变远了。
例如主机A和主机B通信,但是距离较远,就必要思量很多问题:
- 主机A将数据传输给主机B,起首要将数据传输给路由器,怎么传输给路由器?
- 网络上存在大量其他主机,如何定位并找到主机B?
- 数据传输过程中丢失了怎么办?
- 主机A将数据传输给主机B不是目的,只是手段,主机B汲取到数据后如何处理处罚利用?
因此设计了TCP/IP通信协议,其本质是一种解决方案。
5.网络通信协议的原理
在TCP/IP通信协议分层中,其中传输层为TCP,网络层为IP,这两层都是在操作体系中实现C/C++语言实现的,所以对于相同的数据结构,两台计算机都能认识就完成了通信。
所以通信协议的本质是,通信两边都认识结构化的数据类型
二、网络传输的根本流程
1.局域网的网络传输流程
1.MAC地址
每台主机在局域网中,都要有一个唯一标识来包管主机的唯一性,即MAC地址
MAC地址用来辨认数据链路层中相连的节点,长度为48位(6个字节),一般利用16进制数字加上冒号的情势来表示(例如08:00:27:03:fb:19)
MAC地址在网卡出厂时就确定了,不可修改,所以MAC地址是唯一的
虚拟机中的MAC地址不是真实的MAC地址,大概会与已存在的MAC地址发生冲突
2.局域网通信原理(以太网为例)
两台计算机在同一个以太网下,就可以直接通信。
如果同一个以太网下有多台主机,主机A给主机B传输数据,其他全部主机包括主机B都会汲取到数据,但是这样很明显不可以。所以每个主机都会有一个MAC地址,主机A在给主机B传输数据时会带上主机B的MAC地址,其他主机收到数据时对比MAC地址,不是自己的MAC地址就会扬弃数据,是自己的MAC地址才会汲取处理处罚数据。
以太网通信特点:
- 以太网中,任何时刻只允许一台主机向网络中发送数据
- 如果有多台主机同时向网络中发送数据,就会有数据干扰,称为数据碰撞
- 主机在向网络中发送数据之前要先进行碰撞检测和碰撞制止
- 没有互换机的情况下,以太网就是一个碰撞域
3.协议的封装和解包、分用
两台主机在以太网中通信:
每一层都有不同的协议,所以在进行数据传输时每一层都要进行封装和解包。所谓报头就是对应协议层的结构体字段,除了报头剩下的叫做有用载荷,报头+有用载荷=报文。
例如主机1给主机2发送数据“你好”,其数据传输过程以及封装和解包的过程如下:
主机1中数据包从应用层到网卡层的过程叫做封装,封装就是每层协议为数据包加上一个数据首部,包罗了诸如首部有多长、有用载荷有多长、上层协议是什么等信息。
主机2中数据包从网卡层到应用层的过程叫做解包,由于每层大概会有多种协议,将解包后的数据包交给哪一个协议的过程叫做分用。解包就是协议去除掉数据包相应的首部数据,再将数据包交给上层协议处理处罚。
综上,协议对于数据包的封装和解包的过程,十分类似入栈和出栈,所以协议又叫做协议栈。
2. 跨网络传输流程图
1.IP地址
IP地址是存在于IP协议中的,用于标识网络中不同主机的地址。IP协议有两个版本:IPv4和IPv6。
对于IPv4来说,IP地址是一个4字节(32位)的整数,大概通常接纳“点分十进制”的字符串表示IP地址,例如 192.168.0.1 ,点号分割的每一个数字表示一个字节,范围是0 - 255
2.跨网络通信原理
路由器毗连着两个网卡,即路由器毗连着两个不同的局域网
用户A发送的报文颠末主机1的网络层协议封装后,发现目标IP地址不是当前局域网的,即报文不是发送给主机1所在的局域网的,所以要将报文继承向下封装后交给路由器,再由路由器解包到达网络层发现目标IP地址是自己所毗连局域网中的IP地址,所以路由器重新封装报文到达网卡层,再由路由器的网卡层传输给主机2的网卡层,主机2再进行相应的解包,完成跨网络通信。
所以网络层也叫IP层,网络层之上包括网络层不管是局域网通信还是跨网络通信,它们的报文都是一样的。因此利用IP地址可以屏蔽底层网络的差异,提供了网络虚拟层,让全部的网络都是IP网络
因此无论是利用无线网、数据网大概其他网络,它们都可以毗连网络相互通信。
3.IP地址对比MAC地址
IP地址在跨网络中标识主机设备的唯一性,MAC地址只在局域网中标识主机设备的唯一性
IP地址在整个路由过程中一直稳定,MAC地址一直在变
IP地址是一种久远目标,MAC地址是下一阶段目标
IP地址是路径选择的紧张依据,MAC地址是局域网转发的紧张依据
如下图,IP地址一直稳定,而MAC地址要颠末很多路由器而一直在变化:
三、Socket编程预备知识
Socket编程是传输层供给应用层的编程接口,是应用层与传输层之间的桥梁。
利用Socket编程可以开辟客户机和服务器应用程序,这些程序可以或许在当地网络上进行通信,也可通过Internet在全球范围内通信。
1.端口号Port
主机之间通过网络完成数据传输不是目的,真正的目的是要将数据交给体系中的历程。历程是人在体系中的代表,只要把数据交给历程,就相称于人拿到了数据。
体系中存在很多历程,数据传输给目标主机后必要再将数据传给目标历程,这就必要唯一标识历程——利用端口号唯一标识历程。
端口号是传输层协议的内容,是一个2字节16位的整数。IP地址+端口号就可以唯一标识某一台主机的某一个历程。
一个历程可以绑定多个端口号,但是一个端口号只能唯一标识一个历程。
端口号的范围分别:
0-1023是知名端口号,例如为HTTP、FTP、SSH等广为利用的应用层协议;1024-65535是操作体系为体系历程动态分配的端口号。
2.端口号和历程ID的区别
端口号可以唯一标识历程,历程ID也可以唯一标识历程,为什么不利用历程ID来替代端口号呢?
从技术角度来说,确实可以实现利用历程ID来替代端口号,但是这样会导致体系历程管理和网络强耦合。别的并不是全部的体系历程都必要进行网络通信,只有部分历程才必要网络通信,才必要端口号。
3.明白Socket
综上所述,IP地址用来标识互联网中唯一的一台主机,port用来标识该主机上唯一的一个网络历程。所以IP+Port可以表示互联网中唯一的一个历程。
网络通信本质是历程间通信,利用{srcIP, srcPort,dstIP,dstPort}这样的4元组就能标识互联网中唯二的两个历程。
IP+Port叫做套接字Socket
4.认识传输层中的范例协议
1.TCP(Transmission Control Protocol 传输控制协议):
有毗连、可靠传输、面向字节流
2.UDP(UserDatagramProtocol 用户数据报协议):
无毗连、不可靠传输、面向数据报
5.网络字节序
计算机中的字节数据有大端和小端存储方式之分,所以网络数据流同样也会有巨细端之分。如果一个接纳大端存储方式的机器向一个接纳小端存储的机器发送数据,就会产生错误。
因此TCP/IP协议规定:网络数据流必须接纳大端字节序!即从网络中读取到的数据流肯定是大端字节序的,因此我们还必要进行网络字节序和主机字节序的转换。
因为发送主机通常会缓冲区的数据按照内存地址从低到高的顺序发出,汲取主机将从网络中汲取到的字节保存在缓冲区同样是按照内存地址由低到高保存,先将数据保存到低地址再到高地址。例如数据0x1234abcd,发送主机按照0x12 0x34 0xab 0xcd顺序发出,汲取主机将这些数据按照汲取顺序将它们依次存储在缓冲区的低地址到高地址:0x12 0x34 0xab 0xcd。这恰恰符合大端存储模式,所以规定网络数据流必须接纳大端字节序,对于接纳小端存储模式的机器要先将数据转换为大端存储模式再发送。
接下来是网络字节序和主机字节序转换的库函数:
6.Socket编程接口
头文件:#include <sys/types.h> #include <sys/socket.h>
(1)创建 socket 文件形貌符(TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
创建一个套接字体系调用,相称于打开了网卡
domain:指定协议族,常见协议族包括
- AF_INET:IPv4 协议族。
- AF_INET6:IPv6 协议族。
- AF_UNIX 或 AF_LOCAL:当地历程间通信(IPC)。
- AF_UNSPEC:未指定协议族。
type:指定套接字类型,常见套接字类型包括
- SOCK_STREAM:流式套接字,用于面向毗连的 TCP 服务。
- SOCK_DGRAM:数据报套接字,用于无毗连的 UDP 服务。
- SOCK_RAW:原始套接字,允许直接操作 IP 层或更低层的协议。
protocol:通常设置为0,表示选择默认协议
返回值:乐成返回一个非负文件形貌符(可用于后续套接字操作:绑定、监听、毗连、发送和汲取);失败返回 -1,并设置全局变量 errno 以指示错误类型。
关于文件形貌符:Linux体系中统统皆文件,创建套接字相称于打开了网卡设备,网课也是一个文件,全部返回的相称于是网卡的文件形貌符。
(2)绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
将一个套接字与一个特定的地址绑定(通常是IP地址和端口号),当这个套接字用于网络通信时就可以将数据发送到绑定的地址中,大概从绑定的地址中汲取数据。
套接字将监听发送到其绑定地址的数据。
socket:文件形貌符
address:指向sockaddr结构体的指针,结构体中包罗了要绑定的地址信息。sockaddr通常有sockaddr_in(IPv4)、sockaddr_in6(IPv6)、sockaddr_un
address_len:address指向的结构体的长度
返回值:乐成返回0,失败返回-1并设置全局变量 errno 来指示错误类型。
(3)开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
(4)汲取请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
(5)建立毗连 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
(6)汲取数据(UDP,服务端)
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
在UDP协议通信时,利用recvfrom函数汲取来自发送到套接字绑定地址的数据包,并将汲取到的数据包存储在缓冲区buf中
sockfd:文件形貌符
buf:用于存储汲取到的数据包
len:缓冲区的巨细
flags:标志位,通常设置为0,可以修改为其他标志位例如MSG_PEEK 标志允许你查看数据而不从队列中移除它
src_addr:存储源地址信息,即从那里汲取到的数据包(输入输出型参数)
addrlen:存储src_addr中地址的长度
返回值:乐成返回汲取到的数据字节数,失败返回-1,并设置 errno 以指示错误类型
(7)发送数据sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
将数据发送到指定的地址(IP地址+端口号)
sockfd:文件形貌符
buf:指向发送数据所在缓冲区的指针
len:要发送数据所在缓冲区的巨细
flags:标志位,通常设置为0,可以设置为其他值以改变发送行为,如MSG_DONTROUTE(指出数据不提交给路由选择)
dest_addr:发送的目标地址
addrlen:存储dest_addr中地址的长度
返回值:乐成返回发送数据的字节数,失败返回-1并设置全局变量errno以指示错误原因
(8)关闭网络套接字
#include <unistd.h>
int close(int fd);
返回值:乐成返回0,失败返回 -1并设置全局变量 errno 以指示错误原因
7.关于sockaddr结构体
头文件:#include <netinet/in.h> #include <arpa/inet.h>
- #include <sys/socket.h>
- struct sockaddr {
- sa_family_t sa_family; // 地址族
- char sa_data[14]; // 地址数据,具体含义取决于地址族
- };
复制代码 struct sockaddr是一个通用的套接字结构体,它包罗了地址族(sa_family)和地址数据(sa_data)等信息,但是struct sockaddr没有针对特定协议进行具体分别(例如IPv4、IPv6 或 UNIX域 ),因此直接利用struct sockaddr会导致编程上的复杂和错误。
因此引入了struct sockaddr_in和struct sockaddr_un,但是它们的第一个字段都是相同的sa_family_t类型,所以为了兼容性和机动性,必要将struct sockaddr_in和struct sockaddr_un强制类型转换为struct sockaddr类型,再传给体系调用。
增补:地址族sa_family的作用:指定套接字通信的协议类型(IPv4、IPv6、UNIX域)
(1)struct sockaddr_in
专门用于IPv4网络通信
将地址数据sa_data细分为:端口号sin_port、IP地址sin_addr、添补字节sin_zero等信息
- #include <netinet/in.h>
- struct sockaddr_in {
- sa_family_t sin_family; // 地址族,对于 IPv4 来说是 AF_INET
- uint16_t sin_port; // 端口号,使用网络字节序(大端序)
- struct in_addr sin_addr; // IPv4 地址
- char sin_zero[8];//填充字节,确保结构体大小与 sockaddr 一致
- };
- // 其中 struct in_addr 是一个嵌套的结构体,通常定义如下:
- struct in_addr {
- uint32_t s_addr; // IPv4 地址,要使用网络字节序
- };
复制代码 (2)struct sockaddr_un
专门用于UNIX域套接字通信(同一台机器中的历程通信)
结构体中包括:地址族sun_family、套接字路径名sun_path等信息
- #include <sys/un.h>
- struct sockaddr_un {
- sa_family_t sun_family; // 地址族,对于 UNIX 域套接字来说是 AF_UNIX 或 AF_LOCAL
- char sun_path[108]; // 套接字路径名
- };
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |