网络编程(1)

1、网络编程

进程间通信仅局限于同一主机之间多个进程间通信方式,不能实现跨主机的通信方式。因此想要实现跨主机的通信方式,需引入套接字的通信方式。

2、网络的体系结构

2.1概念

  1. 每一层都有自己独立的分工,其它层不可获取
  2. 功能相近的协议组织放在一层,称为协议栈,所以每一层其实有多个协议
  3. 各层之间相互独立,每一层不需要知道下一层如何实现,只需要知道该层通过层间接口锁提供的服务
  4. 优点:稳定,灵活性好
  5. 易于实现和维护,只要知道那一层的功能,就能直接对指定层进行维护
  6. 结构上是不可分割的,各层之间都采用的最合适的技术来实现

2.1.1、OSI(七层)

  1. 面向应用--->应用层:FTP、E-mail、Telnet
  2. 面向服务:
    表示层:数据格式定义、数据转换/加密
    会话层:建立、管理、终止会话;提供同步点、会话恢复、单双工通信控制
  3. 面向通信:传输层--->差错处理/恢复,流量控制,提供可靠的数据传输
  4. 通信子网:
    网络层:数据分组、路由选择
    链路层:数据组成可发送、接收的帧
    物理层:传输物理信号、接口。信号形式、速率

2.1.2 TCP\IP协议族的体系结构

一共是四层:应用层、传输层、网络层、链路层(网络接口层和物理)

  1. 应用层:Telnet、FTP、HTTP、DNS、SMTP等
  2. 传输层:TCP和UDP
  3. 网络层:IP、ICMP和IGMP
  4. 网络接口层和物理层:以太网、PPP、令牌环网、无线局域网等底层传输标准、涵盖链路与物理硬件等

2.1.3、两者对应关系

OSI 功能 TCP/IP协议族
应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP、HTTP、SNMP、FTP、SMTP、DNS、Telnet
表示层 数据格式化、代码转换、数据加密 没有协议
会话层 建立、管理、断开通信会话,同步控制 没有协议
传输层 提供端对端的接口 TCP,UDP
网络层 为数据包选择路由 IP、ICMP、RIP、IGMP
数据链路层 传输有地址的帧以及错误检测功能 SLIP、PPP、ARP
物理层 以二进程数据形式在物理媒体上传输数据 RS232、ISO 物理接口规范

2.1.4、TCP\IP协议族中常见的协议

应用层

HTTP:超文本传输协议。万维网的数据通信基础

FTP:文件传输协议。是用于在网络上进行文件传输的一套标准协议,使用TCP传输

TFTP:简单文件传输协议。是用于在网络上进行文件传输的一套标准协议,使用UDP传输

SMTP:简单邮件传输协议。一种提供可靠且有效的电子邮件传输的协议

传输层:

TCP:传输控制协议。是一种面向连接的、可靠的、基于字节流的传输层通信协议

UDP:用户数据报协议。是一种无连接、不可靠、快速传输的传输层通信协议

网络层

IP:网际互连协议。是指能够在多个不同网络间实现信息传输的协议

ICMP:互联网控制信息协议。用于在IP主机、路由器之间传递控制信息、ping命令使用的协议

IGMP:互联网组管理。是一个组播协议,用于主机和组播路由器之间的通信

链路层

ARP:地址解析协议。通过IP地址获取对方mac地址

RARP:逆向地址解析协议。通过mac地址获取ip地址

3、TCP和UDP的区别

  1. 两者都是传输层的相关协议
  2. 对于TCP而言(稳定)
    1、TCP提供了面向连接的、可靠的数据传输服务
    2、传输过程中,能够保障数据无误、数据无丢失、数据无重复、数据无失序
    TCP通信中会给每个数据包编上编号,该编号称为序列号
    每个序列号都需要应打包应答,如果没有应答,则会将上面的数据包重复传输
    3、TCP通信中,数据传输效率较低,耗费资源较多
    4、数据收发是不同步的
    为了提高传输效率,tcp通信中会将多个较小的,发送时间间隔较短的数据包,沾成一个数据包进行发
    送,该现象称为沾包现象
    5、TCP通信使用场景:对于传输质量要求较高的以及传输量较大的数据通信,在需要可靠传输信息的场合,一
    般使用TCP通信
    例如:账户和密码登录注册、大型文件的下载
  3. 对于UDP通信(快速)
    1、提供面向无连接、不保证数据可靠传输、尽最大努力传输的协议
    2、数据传输过程中,可能会出现数据丢失、重复、失序、乱序等现象
    3、数据传输效率较高、实时性高
    4、限制每次传输的数据大小,多出部分会直接被忽略删除
    5、数据的收发是同步的,不会沾包
    6、使用场景:发送小尺寸的,在收到数据后给出应答比较困难的情况下,采用udp通信
    例如:广播、组播、通信软件的音视频传输

4、字节序的概念

字节序:计算机在存储多字节整数 时,根据主机的CPU处理结构不同,我们将主机分成大端存储小端存储

  • 大端存储:内存地址的低位存储的是数据的高位
  • 小端存储:内存地址的低位存储的是数据的低位
  1. 网络字节序:规定都是大端存储的。无论发送端是大端存储还是小端存储,在传输多字节整数时,一律先转换为网络字节序。经由网络传输后,到达目的主机后,在转换为主机字节序即可

  2. 网络字节序和主机字节序之间相互转换的函数

    c 复制代码
    主机:host
    网络:network
    转换:to
    #include <arpa/inet.h>
    uint32_t htonl(uint32_t hostlong);//将4字节整数主机字节序转换为网络字节序,参数
    是主机字节序,返回值是网络字节序
    uint16_t htons(uint16_t hostshort);//将2字节整数主机字节序转换为网络字节序,参数
    是主机字节序,返回值是网络字节序
    uint32_t ntohl(uint32_t netlong);//将4字节整数的网络字节序转换为主机字节序,参数
    是网络字节序,返回值是主机字节序
    uint16_t ntohs(uint16_t netshort);//将2字节整数的网络字节序转换为主机字节序,参
    数是网络字节序,返回值是主机字节序
  3. 何时使用网络字节序转换函数:在进行多字节整数网络传输时,需要使用字节序转换函数;在进行单字节整数传输时,不需要使用;在网络中传输字符串时,也不需要使用

5、ip地址

  1. ip地址是主机在网络中的唯一标识,由两部分组成,分别是网络号和主机号。网络号:确定计算机所从属的网络。主机号:标识该设备在该网络中的一个编号
  2. 作用:在网络传输过程中,给网络传输载体添加必要的信息,指定源ip地址和目的ip地址,以便于找到目的主机
  3. IP地址的分类
    1、IPv4:是使用4字节的无符号整数表示的一个IP地址,取值范围【0,2^32-1】
    2、IPv6:是使用16字节无符号整数表示的一个ip地址,取值范围 【0, 2^128-1】
    3、IPv6是不兼容IPv4的
  4. 地址划分:一共分为5类网络,分别是A类、B类、C类、D类、E类网络
网络类型 取值范围 网络号个数 主机号个数 用途
A类 1.0.0.0---126.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 组播IP
E类 240.0.0.0---255.255.255.255 保留,科研实验、特殊预留

5.2、特殊的IP地址

1、网络号 + 全为0的主机号:表示该网络,不分配给任何主机使用,例如:192.168.10.0

2、网络号 + 全为1的主机号:表示当前网络的广播地址,也不分配给任何主机使用,例如:192.168.10.255

3、网络号 + 主机号为1:默认表示网关,当然可以自己制定网关ip

4、127.0.0.0:本地环回ip,当没有网络时,用于测试当前主机的ip

5、0.0.0.0:表示当前局域网中的任意一个主机号

6、255.255.255.255:一般表示广播地址

5.3、点分十进制

点分十进制数据向4字节无符号整数转换的相关函数

c 复制代码
地址:address
网络:network
转换:to
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);//将点分十进制的ip地址转换为4字节无符号整数的网络字节序,参数时点分十进制数据,返回值时4字节无符号整数
char *inet_ntoa(struct in_addr in);//将4字节无符号整数的网络字节序,转换为点分十进制的字符串

6、端口号

  1. 作用:为了区分同一个主机之间的每个进程的,使用端口号来进行标识;概念:端口是是一个 2 字节的无符号整数表示的数字,取值范围 【0, 65535】
  2. 为什么不使用进程号标识,而使用端口号:因为进程号是进程的唯一标识,当同一个应用程序,关闭再打开后,并不是同一个进程号了,但是是同一个应用程序,所以,端口号标识的是我们的应用程序,当一个应用程序关闭再打开后,端口号不变
  3. 引入端口号后,网络通信:ip 地址 + 端口号(ip地址可以在网络中,唯一确定对端的主机地址,通过端口号能够找到该主机中指定的对端应用程序)
  4. 端口号的分类:
    1、0~1023 :众所周知的 "VIP"端口号:被特殊的应用程序已经占用了的
    2、1024 ~ 49151:用户可分配的端口号
    3、49152~65535:动态分配或系统自动分配的端口号