您的位置:首页 > 娱乐 > 八卦 > 中国景观设计公司十强_网页制作专业搜题_seo技术优化技巧_素材网

中国景观设计公司十强_网页制作专业搜题_seo技术优化技巧_素材网

2024/12/22 15:43:56 来源:https://blog.csdn.net/2301_76197086/article/details/143837466  浏览:    关键词:中国景观设计公司十强_网页制作专业搜题_seo技术优化技巧_素材网
中国景观设计公司十强_网页制作专业搜题_seo技术优化技巧_素材网

目录

一、网络协议

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_INETuint16_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_LOCALchar        sun_path[108]; // 套接字路径名
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com