您的位置:首页 > 文旅 > 旅游 > 【计算机网络】网络基础

【计算机网络】网络基础

2024/10/6 4:06:16 来源:https://blog.csdn.net/2301_77459845/article/details/142129900  浏览:    关键词:【计算机网络】网络基础

目录

  • 一、认识协议
  • 二、网络分层
  • 三、网络与OS之间的关系
  • 四、局域网(以太网为例)通信
  • 五、跨网络传输
  • 六、端口号
  • 七、传输层的典型代表
  • 八、socket编程接口

一、认识协议

协议是一种约定,计算机协议就是计算机之间的约定。

为什么存在网络协议?

计算机是人使用的工具,人与人之间传输信息,如果距离很远,就需要网络。距离远就一定会引发一些问题:
1、如何使用数据的问题
2、可靠性问题
3、主机定位问题
4、数据报局域网转发问题
解决的方法通过tcp/ip协议栈,这是一种协议,可以看出协议是一种解决方案,而要把解决方案变得可扩展、好维护,于是,设计师就把网络协议设计成层状结构。

二、网络分层

为什么有网络分层?

层与层之间是松耦合的,可以随时替换或者方便维护

是什么?
OSI七层模型:OSI(OpenSystemInterconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范。把网络从逻辑上分为了7层.每一层都有相关、相对应的物理设备,比如路由器,交换机。它的最大优点是将服务、接口和协议这三个概念明确地区分开来,过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。

  • 应用层:针对特定应用的协议
  • 表示层:设备固有格式和网络标准数据格式的转换
  • 会话层:通信管理
  • 传输层:管理两个节点之间的数据传输
  • 网络层:地址管理和路由选择
  • 数据链路层:互联设备之间的传送和识别数据帧
  • 物理层:比特流与电子信号之间的转换

TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求

  • 物理层:负责光/电信号的传递方式
  • 数据链路层:负责设备之间的数据帧的传送和识别
  • 网络层:负责地址管理和路由选择
  • 传输层:负责两台主机之间的数据传输
  • 应用层:负责应用程序间沟通

三、网络与OS之间的关系

网络分层与系统分层的关系图:
在这里插入图片描述
应用层属于用户操作的空间,可以从网络库使用网络方面的系统调用。传输层和网络层是操作系统内部实现的,两个合起来可以叫做tcp/ip协议栈。数据链路层有网卡的驱动程序。物理层有网卡。

物理层我们考虑的比较少,我们只考虑软件相关的内容。因此很多时候我们直接称为TCP/IP四层模型。

一般而言:

  • 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容
  • 对于一台路由器,它实现了从网络层到物理层
  • 对于一台交换机,它实现了从数据链路层到物理层
  • 对于集线器,它只实现了物理层

但是并不绝对,很多交换机也实现了网络层的转发,很多路由器也实现了部分传输层的内容(比如端口转发)

两个OS之间的通信:
在这里插入图片描述
所有的OS想要入网,必须遵守TCP/IP协议,保证不同主机之间的通信。OS不同,但是网络必须是同一套。

重新理解协议:
协议是双方能够识别的结构体数据类型。TCP/IP协议栈是C语言编写的,双方传输使用的是同样的数据类型,所以,经过网络,双方一定能识别对方的信息。这些信息,就是结构化的数据类型。

四、局域网(以太网为例)通信

在这里插入图片描述
两台主机在同一个局域网,能够直接通信。与在教室上课类似。每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac地址。mac地址是什么?MAC地址用来识别数据链路层中相连的节点。

  • 以太网中,任何时刻,只允许一台机器向网络中发送数据
  • 如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
  • 所有发送数据的主机要进行碰撞检测和碰撞避免
  • 没有交换机的情况下,一个以太网就是一个碰撞域
  • 局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定

发送消息的过程:
一个用户发送了“你好”这个消息给另一个用户,传输过程中的每一层,有报头和有效载荷。报头部分,就是对应协议层的结构体字段;除了报头,剩下的叫做有效载荷;报文=报头+有效载荷。
在这里插入图片描述
报文从上到下每层添加一层协议报头叫封装;从下到上将报头和有效载荷分离与将自己的有效载荷交给上一层的协议叫做解包与分用。最终消息被对方接收。
在这里插入图片描述

五、跨网络传输

在这里插入图片描述
用户A发送消息给用户B,需要经过每层的报文的封装。因为用户A与用户B是不同的局域网,所以它们不能直接通信,需要路由器。路由器一般至少横跨两个子网,即至少有两个网卡(两个mac地址)。用户A发送的数据包在IP层有源IP地址和目的IP地址,这两个地址这整个传输的过程中是不变的(A->B)。到了数据链路层,封装了源mac地址和目的mac地址,这两个是会变化的,当前的源mac地址是A,目的mac地址是left,路由器其中的一个子网的数据链路层。用户A主机的数据链路层的数据帧交给路由器解包,路由器IP得到的是源IP和目的IP地址。路由器知道用户A要给用户B发信息,所以路由器的另一个子网与用户B联系,对源IP和目的IP地址重新封装,源mac地址和目的mac地址就发生了变化,源mac地址是right,mac地址是B,然后交给用户B,最后逐层向上解包与分用,用户B获取信息。

IP地址是在IP协议中,用来标识网络中不同主机的地址
源IP地址和目的IP地址是一直不变的
源mac地址和目的mac地址每经过路由器都会变化
在IP层下有max地址变化的差异,IP层以及往上没有,说明IP网络可以屏蔽底层网络的差异
不同的层对数据包的叫法不同,传输层叫数据段,网络层叫数据报,链路层叫数据帧

六、端口号

用户发送消息给另一个用户,表示用户的其实是一个进程(客户端、服务端)。把数据发送给另一个主机的目的是把数据交给目标主机的某一个服务上(进程)。服务必须要有唯一的标识,叫端口号。

端口号可以确定该主机上的唯一的一个进程,IP地址可以确定某一个主机,所以两个结合就能找到互联网中唯一的一个进程。两个唯一的进程通信叫做socket通信,本质也是进程间通信。

有了pid为什么还要有端口号?

进程ID属于系统概念,技术上也具有唯一性,确实可以用来标识唯一的一个进程,但是这样做,会让系统进程管理和网络强耦合,实际设计的时候,并没有选择这样做。

七、传输层的典型代表

传输层属于系统内核,要进行网络通信,必须通过传输层提供的系统调用

TCP(TransmissionControlProtocol传输控制协议)

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流

UDP(UserDatagramProtocol用户数据报协议)

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

网络字节序
内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢?

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出
  • 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存
  • 网络数据流的地址规定:先发出的数据是低地址,后发出的数据是高地址
  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节
  • 如果当前发送主机是小端,就需要先将数据转成大端

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
在这里插入图片描述

  • h表示host,n表示network,l表示32位长整数,s表示16位短整数
  • htonl表示将32位的长整数从主机字节序转换为网络字节序
  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回
  • 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回

八、socket编程接口

socket常见API:

创建socket文件描述符(TCP/UDP,客户端+服务器)

intsocket(intdomain,inttype,intprotocol);

绑定端口号(TCP/UDP,服务器)

intbind(intsocket,conststructsockaddr*address,socklen_taddress_len);

开始监听socket(TCP,服务器)

intlisten(intsocket,intbacklog);

接收请求(TCP,服务器)

intaccept(intsocket,structsockaddraddress,socklen_taddress_len);

建立连接(TCP,客户端)

intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);

socket编程是有不同种类的:

  • Unix socket——本地通信
  • inet socket——跨网络通信
  • raw socket——网络管理

有不同的种类,那么就有不同的结构体类型:struct sockaddr_in和struct sockaddr_un。为了统一类型,方便管理使用,所以都要把它们强转成struct sockaddr。强转后系统会自己识别是本地通信还是网络通信,根据我们用户传的是AF_INET还是AF_UNIX
在这里插入图片描述

版权声明:

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

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