网络编程--杂识

协议----乃是数据传输时要遵守的格式要求

两种常见的程序架构是C/S B/S架构

  1. C/S :优点,性能稳定,协议选用灵活,适用于大量数据缓存,尤以游戏较为常见

  2. 安装在用户电脑上,可能会对用户安全造成影响

  3. 开发效率方面,开发团队需编写服务端和客户端两端代码,联合调试是一场噩梦

B/S

  1. 减少了厂商植入恶意插件的可能,相比C/S减少1/3工作量;跨平台

  2. 必须支持HTTP协议,须不折不扣的支持

  3. 不支持庞大数据缓存

OSI七层模型(物数网传会表应),除了TCP协议工作在传输层,/IP协议工作在网络层,基本上说的出来的协议都工作在应用层

×额外的知识模拟电路信号向数字信号的转换


  1. 物理层,这一层数据单位是比特(物理传输层)

  2. 数据链路层:定义 格式化数据,以帧为单位传输数据

  3. 网络层:不同位置,不同主机之间的链接

  4. 传输层:端口号和进程,对下层接收的数据进行分段和传输,到达目的地之后重组,这一层数据称之为段。

  5. 会话层:通过传输层建立,不同系统间的通信(通过IPMAC

  6. 表示层:确保不同系统应用层数据能相互理解,读取,如有可能,这层会有个通用格式来完成不同格式数据的转换

  7. 应用层:为用户程序提供网络服务


数据包的封装

由于协议的存在,实际发送的数据层层封装,原始数据上套上应用层…然后逐一套上传输,网络,链路层数据(帧头),再加上帧尾,到达目的地址后再层层解封装。

帧头,帧尾的添加都由操作系统完成。

网络发送数据通过网卡传输到网络环境,网卡到网络环境之间有数道

除了应用层和帧尾在操作系统在用户空间完成封装,帧头的其他层封装在操作系统内核完成。

 

 

网络节点之间通信技术详解
封装好的数据包,由节点A传至Z,中途可能有若干路由器B….Y,根据IP地址寻路
每一路由结点里都有一个路由表,其中记录了,本路由器连接了哪些路由器,这种路由结点根据路由表寻找下一个路由结点的行为称之为寻路。如此按部就班直到最后一个目标地址,就建立
了一条通路。TCP
/IP协议之所以被认为“稳定”是因为,通路一旦确定,以后全都遵循这条通路传送信息 以太网帧协议 在发送数据的最外层-----链路层(6字节目标地址(目标主机MAC地址---网卡编号,如同身份证,保证在网络环境中唯一,不会重复),6字节源地址,2字节类型(以太网帧0800 :
普通以太网数据包; 0806 :ARP请求包,用来请求下一跳的MAC地址 ))

 

ARP数据报:请求下一跳的mac地址
如果,根据路由表算出的下一跳IP地址,链接发生断裂,则数据包只能绕道而行,如果数据量逐渐增多,则会造成网络阻塞,因此,就必须限制下一跳的次数,实在不行,姑奶奶他妈不传
了!
IP协议:
两个版本 IPV4 ,IPV6解决IPV4不够用的问题,能够让地球上每一粒沙都有个IP地址
IP需要关注的部分:4位版本号,4位首部长度(也就是除了数据部分,所发送数据包的头部部分,IP数据报的首部长度是20字节,帧数据首部长度是14字节),8位TTL生存周期,
32位IP源地址
  •  套接字
数据发到网络环境通常通过交换机,再由交换机转发至路由器
但凡提到套接字,必定有两端:数据的发送端和接收端,
ip地址在网络环境中可以唯一的表示一台主机,ip+端口号可以在网络环境中唯一标识一个进程。
socket通信原理:
    套接字是linux操作系统中的一种文件类型----伪文件
    linux中有7种文件类型:其中普通文件,目录文件,软链接三种文件类型占用内存,字符设备,块设备,管道,套接字
    管道,fd[0]读端,fd[1]写端,半双工,如同对讲机
    socket乃是双向全双工,一个文件描述符,两个缓冲区(一个读,一个写)
对于数字8910.67
低地址存高位----大端法按照内存地址顺序由近及远依次存入8,9,1,0,.6.7
低地址存低位----小端法(与上边相反)x86就是如此,小端法存储,源于windows基于Intel x86平台
理论上是这样,不同操作系统可能不尽相同。

网络数据流采用了大端字节序,操作系统采用了小端法存储,这样一来网卡发送的数据字节序发生了变化,这样一来,接收端在解包的过程中无法正确解析IP地址等关键信息,这就需要能
转换网络字节序和主机字节序的系列函数 uint32_t htonl(uint32_t hostlong) uint16_t htons(uint16_t hostshort) uint32_t ntohl(uint32_t netlong) uint16_t ntohs(uint16_t netshort)
由于点分十进制是我们表达IP的惯用手法,但在网络环境中,这种方法显然无法满足要求,这就需要一组函数完成两种(点分十进制和网络字节序)规制的相互转换
int inet_pton(int domain,char * src, void* des) //第一个参数代表net版本类型 ipv4,或是ipv6
char * inet_ntop(int domain,const void * src, char* des socklen_t size)

 

 

 

 

posted @ 2020-02-04 22:34  saintdingtheGreat  阅读(156)  评论(0编辑  收藏  举报