c++ 实时通信系统(基础知识TCP/IP篇)

编写前的基础知识

  C/S结构:

  C/S是Client/Server,即客户端/服务器端架构,一种典型的两层架构。客户端包含一个或多个在用户的电脑上运行的程序服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。我们在本次的搭建就是利用的是Socket服务器端,其架构如下图所示:

ps:如果想对其进行进一步的了解可以看看这篇文章:https://blog.csdn.net/qq_26399665/article/details/52421723socket技术分为阻塞和非阻塞两种,两种的区别是是否立刻的返回,非阻塞的方式资源的利用率会更高。

https://www.cnblogs.com/onepixel/p/7092302.html(TCP/IP协议)

服务器端:

  1. socket()创建监听Socket,创建TCP套接字
  2. bind()绑定服务器端口,将套接字绑定到本地的地址和端口上
  3. listen()监听客户端连接accept()接受连接
  4. recv/send接收及发送数据
  5. close()关闭socket

客户端:

  1. socket()创建监听Socket
  2. connect()连接服务器
  3. recv/send接收及发送数据
  4. close()关闭socket

  有关于eproll:https://www.cnblogs.com/fnlingnzb-learner/p/5835573.html  ,这里我们不详细介绍,我们主要来介绍一下Socket通信,Socket是一个编程接口(API),TCP/IP协议需要向开发者提供做网络开发用的接口,这就是Socket接口,它是对TCP/IP协议网络通信的封装,首先我们来介绍一下TCP/IP协议族:

  但是呢在此之前我们先介绍一个基础的知识,就是IP地址和MAC地址的区别,首先么一个上网的设备都会有一个网卡的东西(又叫做网络适配器),每台上网的电脑的都有一个不同的MAC地址就像是一个身份证一样的东西,而IP地址是设备地址一样的存在,IP地址分为内网IP地址和外网Ip地址,再外网中每个路由都有不同的IP地址,而连接路由的设备都有相同的外网IP,但是在这个局域网中每个设备的内网IP都各不相同,其实就像每一个人都有属于自己的身份证件,如果我们根据身份证向某人发快递那么将非常的困难,而外网的IP地址就像省市小区一样具有唯一性,可能几号楼几单元(内网)在不同的局域网中可能相同,但是加上外网的IP后基本就不会搞错了,而且我们发送快递的效率将大大的提升。

  两个主机通信三个条件:MAC,IP,端口(pid)

好了接下来我们来介绍TCP/IP

  链路层:

  整个数据帧由首部数据尾部三部分组成,首部固定为14个字节,包含了目标MAC地址、源MAC地址和类型;数据最短为46个字节,最长为1500个字节,如果需要传输的数据很长,就必须分割成多个帧进行发送;尾部固定为4个字节,表示数据帧校验序列,用于确定数据包在传输过程中是否损坏。因此,以太网协议通过对电信号进行分组并形成数据帧,然后通过物理介质把数据帧发送给接收方。所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。

  网络层:

  

  对于上面的过程,有几个细节问题值得我们思考:

发送者如何知道接收者的MAC地址?

发送者如何知道接收者和自己同属一个子网?

如果接收者和自己不在同一个子网,数据包如何发给对方?

为了解决这些问题,网络层引入了三个协议,分别是IP协议ARP协议路由协议。

【1】IP协议

通过前面的介绍我们知道,MAC地址只与厂商有关,与所处的网络无关,所以无法通过MAC地址来判断两台主机是否属于同一个子网。

因此,网络层引入了IP协议,制定了一套新地址,使得我们能够区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的IP地址。

IP地址目前有两个版本,分别是IPv4IPv6,IPv4是一个32位的地址,常采用4个十进制数字表示。IP协议将这个32位的地址分为两部分,前面部分代表网络地址,后面部分表示该主机在局域网中的地址。由于各类地址的分法不尽相同,以C类地址192.168.24.1为例其中前24位就是网络地址,后8位就是主机地址。因此, 如果两个IP地址在同一个子网内,则网络地址一定相同。为了判断IP地址中的网络地址,IP协议还引入了子网掩码, IP地址和子网掩码通过按位与运算后就可以得到网络地址。

由于发送者和接收者的IP地址是已知的(应用层的协议会传入), 因此我们只要通过子网掩码对两个IP地址进行AND运算后就能够判断双方是否在同一个子网了。

【2】ARP协议

即地址解析协议,是根据IP地址获取MAC地址的一个网络层协议。其工作原理如下:

ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,然后这个数据包会在链路层进行再次包装,生成以太网数据包,最终由以太网广播给子网内的所有主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,然后和自己的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。ARP接收返回消息,以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。cmd输入 arp -a 就可以查询本机缓存的ARP数据。

【3】路由协议

通过ARP协议的工作原理可以发现,ARP的MAC寻址还是局限在同一个子网中,因此网络层引入了路由协议,首先通过IP协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过ARP协议查询对应的MAC地址,然后以广播的形式向该子网内的主机发送数据包;如果不在同一个子网,以太网会将该数据包转发给本子网的网关进行路由。网关是互联网上子网与子网之间的桥梁,所以网关会进行多次转发,最终将该数据包转发到目标IP所在的子网中,然后再通过ARP获取目标机MAC,最终也是通过广播形式将数据包发送给接收方。

而完成这个路由协议的物理设备就是路由器,在错综复杂的网络世界里,路由器扮演者交通枢纽的角色,它会根据信道情况,选择并设定路由,以最佳路径来转发数据包。

【4】IP数据包

在网络层被包装的数据包就叫IP数据包,IPv4数据包的结构如下图所示:

IP数据包由首部和数据两部分组成,首部长度为20个字节,主要包含了目标IP地址和源IP地址,目标IP地址是网关路由的线索和依据;数据部分的最大长度为65515字节,理论上一个IP数据包的总长度可以达到65535个字节,而以太网数据包的最大长度是1500个字符,如果超过这个大小,就需要对IP数据包进行分割,分成多帧发送。

所以,网络层的主要工作是定义网络地址,区分网段,子网内MAC寻址,对于不同子网的数据包进行路由。

  传输层

  传输层其实就是TCP(又称确认版UDP,主要传送控制指令)或是UDP层(传送数据指令),将每个应用程序分配端口,将数据传送到具体的应用程序。

  应用层就不多讲了,其实总结起来就是当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。

  而Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

 

 https://blog.csdn.net/qq_28865297/article/details/71123832

posted @ 2018-07-19 14:26  yskn  阅读(7338)  评论(0编辑  收藏  举报