zoukankan      html  css  js  c++  java
  • 网络编程--杂识

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

    两种常见的程序架构是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)
  • 相关阅读:
    jquery对象中 “冒号” 详解
    vscode自定以vue代码模板
    Vue项目开发环境proxyTable反向代理,生产环境下服务接口地址找不到的解决
    JS函数的节流和防抖
    BFC-块状格式化上下文
    c# 鼠标钩子
    C# 以管理员身份运行WinForm程序
    样式更换
    Revert to this revision 和 Revert changes from this revision 区别
    人工智能几行代码实现换脸
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/12261859.html
Copyright © 2011-2022 走看看