Linux网络编程基础知识

网络编程

  • 本质:
    • 使用操作系统的接口函数,使得应用程序具备收发网络数据的能力
  • 核心概念
    • 协议:为进行数据通信而预定义的数据规则
    • 地址:网络通信中的用于标识设备的整数值
    • 端口号:
      • 设备为收发数据而指定的数值,用于标识具体链接
      • 可理解为:设备中用于网络通信的数据通道
    • 角色
      • 服务端:等待连接的设备
      • 客户端:发起连接的设备

网络基本知识

  • 网址不是IP地址,是网络信息资源的地址,即:URL
  • 域名是IP地址的别名,多个域名可指向同一个IP地址
  • 协议是一种约定,即:预先定义的规则
  • 协议可以基于文本定义,也可以基于二进制定义

字节序

本质

  • 不同类型CPU主机,内存存储 多字节整数 序列的方式。
    • char,字符串,float,double均没有字节序的说法
    • short, int, long , long long 有字节序的说法。

小端系统

  • 采用小端模式(little-endian)的系统,即:数据低字节放在系统内存低地址

大端系统

  • 采用大端系统(big-endian)的系统,即:数据低字节放在内存高地址中

网络字节序

  • 网络字节顺序采用大端模式,所以在小端系统中需要做字节序转换

利用union的性质判断系统大小端

Linux网络编程基础知识_第1张图片

int system_mode()
{
	union SM
	{
		int i;
		char c;
	};
	
	union SM sm;
	sm.i = 1;
	
	return sm.c;
}

int main()
{
	printf("System Mode: %d\n", system_mode());
    //返回1为小端,返回0为大端
	return 0;
}

关于端口号和IP地址

端口号

  • 端口号是一个2字节数据
  • 为了区分一台主机收到的数据包交给哪个进程处理,使用端口号来区分。程序启动后将端口号和进程绑定在一起。
  • 网络里面的通讯是由 IP地址+端口号 来决定
  • 0 - 1023作为特定端口被预定义(分配给特定应用程序)
    • 使用被预定义的端口号会导致bind失败
  • 临时端口号:49152~65535,这部分是客户端运行时候动态选择的
  • 可以使用的:1024~49151,就是我们平时编写服务器使用的端口号
  • TCP和UDP的端口号互相独立

IP地址

IP地址范围 网络号个数 主机号个数
A类地址 0.0.0.0~127.255.255.255 2^7(网络号) 2^24(主机号) 大型网络
B类地址 128.0.0.0~191.255.255.255 2^14 2^16 名地址网管中心
C类地址 192.0.0.0~223.255.255.255 2^21 2^8 校园网或企业网、家庭网
D类地址 224.0.0.0~239.255.255.255 组播地址
E类地址 240.0.0.0~255.255.255.255 保留

Linux网络编程基础知识_第2张图片

  • IP地址是一个4字节地址族(可分为5类地址)
    • 将32位IP地址的二进制数,以8bit为一组,用十进制表示,利用点分割。
    • D类常用于多播(无网络号和主机号分配)
    • E类常用于实验(无网络号和主机号分配)
  • IP地址分为网络标识主机标识两部分(网络标识=网络号,主机标识同理)
    • 网络标识:标识网络设备所在网络
    • 主机标识:标识网络设备具体地址
  • 特殊IP地址
    • 0.0.0.0 / 0
      • 保留,常用于代表“缺省网络”
    • 127.0.0.0 / 8
      • 回环地址,常用于本地软件回送测试
    • 255.255.255.255 / 32
      • 广播地址
    • 每个子网段的第1个IP地址
      • 子网网号
    • 每个子网段的最后一个IP地址
      • 广播地址
    • 局域网内第二个IP地址
      • 网关IP
  • 私有IP地址:不在公网使用,只在内网使用
    • 10.0.0.0 - 10.255.255.255 / 8
    • 172.16.0.0 - 172.31.255.255 / 16
    • 192.168.0.0 - 192.168.255.255 / 24

子网掩码

  • IP地址和子网掩码配合使用区分网络标识和主机标识
  • 子网掩码的表现形式也是一个四字节的整型数
  • 子网掩码用于从IP地址中提取网络标识
  • 子网掩码
    • 用于将一个大的IP网络中的主机号划分为若干小的子网络(常用)。
    • 或者将若干个小网络组合成一个大的局域网(称之为超网技术)。
      • 指明一个IP地址的哪些位表示的是主机所在的子网
      • 指明哪些位表示的是主机的位掩码。
      • 子网掩码不能单独使用,必须结合IP地址一起使用
  • 子网掩码的格式
    • 与IP地址一样长的32位无符号整数,是由一串连续的1,后面跟着一串连续的0组成。

计算子网可用IP地址

  • 设子网掩码为(M.N.P.Q)
  • 子网可用IP地址n = (256-M) * (256-N) * (256-P) * (256-Q) - 3

域名系统

  • 域名本质就是IP地址的别名,一个域名可以对应多个IP地址

域名结构

  • 例如域名 www.baidu.com.cn 从右向左看
    • cn为高级域名,也叫一级域名,它通常分配给主干节点,取值为国家名,cn代表中国
    • com为网络名,属于二级域名,它通常表示组织或部门
    • 中国互联网二级域名共40个,edu表示教育部门,com表示商业部门,gov表示政府,军队mil等等
    • baidu为机构名,在此为三级域名,表示百度
    • www:万维网world wide web,也叫环球信息网,是一种特殊的信息结构框架。

TCP/IP分层结构

  • 应用层
    • 各个应用程序可以定义(使用)各种各样的协议
    • 编码后发送字符串数据
    • 收到字符串数据,根据约定解码
  • 传输层
    • 确保发出的数据能够到达目标主机,完成数据传输
    • 将数据分包,加上标识头,序号等通用信息
    • 根据附加信息进行数据组包,恢复原始应用层数据形态
  • 网络层
    • 填写数据包地址,选择数据传递路径
    • 加上收发地址信息,选择最佳传输路径
    • 解析二进制数据,恢复原始传输层数据形态
  • 数据链路层
    • 融合不同连接方式的链路,屏蔽网络差异
    • 将数据封装并转换为二进制序列
    • 组装二进制数据,恢复原始网络层数据形态
  • 物理层
    • 具体链接方式:有线,无线,光纤

Linux网络编程基础知识_第3张图片

特点

  • 上层依赖接邻下层的能力,下层只为直接接邻上层服务
  • 上层不知道下层的工作机制,下层不管上层传输的数据内容
  • 不做跨层服务,层次结构中的角色缺一不可

网络层(IP层)

  • IP寻址

    • IP地址属于网络层地址,用于标识网络上的主机
  • 路由控制

    • 控制数据如何达到目标主机(如:需要经过哪些路由器转发)
  • 无连接

    • 数据包根据IP地址在网络上传递(无需与目标实现建立连接)
  • MAC地址

    • 物理地址,48bit全球唯一,网卡编号,网络设备的身份标识(cmd —> ipconfig/all),由厂商出厂后确定。
    • 数据链路层所使用的硬件地址。MAC地址与网络无关,出厂时写入到网络设备中。当主机从网络上每收到一个数据帧时,首先检查数据帧中的MAC地址。如果是发往本主机的数据帧则收下,之后进行其他的处理;否则就将此帧丢弃,不再进行其他的处理
  • ICMP协议(Internet Control Management Protocol)

    • 英特网控制管理协议,ping检测网络就是用这个协议
    • 用于在IP主机、路由器之间传递控制消息

IP地址与MAC地址

  • IP地址是动态的,不特定于某个具体的硬件(MAC地址隶属于具体硬件)
  • IP地址是网络层使用的地址(用于跨网络投递数据包)
  • MAC地址是数据链路层的地址(用于确定目标网络中接收数据的主机)
  • 路由器中记录了本网络中主机IP地址与MAC地址的映射关系

ARP/RARP 地址解析协议/逆向地址解析协议

  • ARP(Address Resolution Protocol):通过ip地址获取其对应的mac地
  • RARP(Reverse Address Resolution Protocol):通过mac地址获取其对应的ip地址。
  • PPP(Point to Point Protocol)协议:拨号协议(GPRS/3G/4G)
  • MTU:最大传输单元 默认是1500bytes
  • MSS:最大报文长度 默认是1460bytes

网络层信息的收发

  • 为了将数据发给目标主机,所有主机都维护着一张路由表
  • 路由表记录了IP数据包下一步应该发给哪个路由器

IP数据转发

  • IP数据包转发才有的“尽力服务”策略
    • 尽力服务指会努力,但不保证结果
    • 转发时会通过附加信息检查数据合法性,但出现异常不会进行重发
    • 以包为单位进行转发,不保证到达(发出之后,石沉大海)

传输控制协议(TCP)

  • TCP在协议实现上提供可靠数据传输,建立在IP数据转发之上
    • TCP不存在数据包的概念,实现了流式传输(数据如流水,无头无尾)
    • TCP内部有服务状态,能够精确知道数据是否已经发送成功,是否被接收,。。。
    • TCP在行为上可进行阻塞控制(网络环境变差时,能够调整数据发送速度)

UDP

  • 完全继承网络层的工作方式
  • 无需连接,直接指定IP地址和端口即可发送数据
  • 监听固定端口,只要有数据,统统接收
  • 不管网络情况,只要是数据统统可发送
  • 不关心数据是否到达对端
  • 限制数据包的大小,超出部分直接删除。

使用环境

  • 对数据不敏感,需要实时性的场合(如:直播,实时游戏)
  • 网络环境比较好的场合(如:物联网家居)
  • 需要深度定制协议的场合(如:“不丢包”的UDP协议)

你可能感兴趣的:(linux,网络)