网络适配器 :作用 收发数据 mac地址 作用: 用来标识一块网卡 6个字节 物理地址 (前 3 位是 厂商ID) 网卡中英文对照
ip用来标识一台主机 逻辑地址 iPv4 : ip地址是4字节 32位 ipv6 : 128位 16字节 子网id ip中被子网掩码中1连续覆盖的位 主机id ip中被子网掩码中0连续覆盖的位
网段地址: 192.168.1.0
广播地址: 192.168.1.255
子网掩码 netmask: 用来区分子网id 和主机id
作用: 用来标识应用程序(进程) port: 2个字节 0-65535 知名端口 0-1023 自定义端口 1024 - 65535 查看端口命令 netstat4、OSI七层模型
物理层: 双绞线接口类型, 光纤的传输速率等等 数据链路层: mac 负责收发数据 网络层: ip 给两台主机提供路径选择 传输层: port 区分数据递送到哪一个应用程序 会话层: 建立链接 表示层: 解码 应用层 在 TCP/IP 模型中,不细分为 7 层,只需要 4 层即可。
传输层: 端口标识 (进程 — 进程)
网络层: IP 标识 (主机 — 主机)
链路层: Mac 标识 (设备 — 设备)
规定了数据传输的方式和格式
应用层协议: FTP: 文件传输协议 HTTP: 超文本传输协议 NFS: 网络文件系统 传输层协议: TCP: 传输控制协议 UDP: 用户数据报协议 网络层: IP: 英特网互联协议 ICMP: 英特网控制报文协议 ping IGMP: 英特网组管理协议 链路层协议: ARP: 地址解析协议 通过ip找mac地址 RARP: 反向地址解析协议 通过mac找ip6、网络通信过程
从上到下组包,从下往上拆包7、ARP协议
ARP:地址解析协议 (通过 IP 地址寻找主机 MAC 地址) 广播发送 ARP 请求,对应主机收到 ARP 请求后,单播回应发送方
ARP 请求包
B/S browser/ server (B/S模式 有浏览器,只能选择 http 协议) C/S cilent/server (C/S模式 协议选择灵活) c/s 优缺点:性能较好 客户端容易篡改数据 开发周期较长 b/s 优缺点:性能低 客户端安全 开发周期短9、进程间通信
无名管道、命名管道、mmap、文件、信号、消息队列、共享内存等 只能用于本机的进程间通信 进程间的通信需要使用: socket (socket 必须成对出现)10、字节序
0x0102: 低地址 02 高地址 01 小端: 低位存低地址,高位存高地址 大端: 低位存高地址,高位存低地址 网络字节序规定用大端存储 主机间通讯: 主机字节序 —— 网络字节序 —— 主机字节序11、ip转换
#include int inet_pton(int af, const char *src, void *dst);
功能: 将点分十进制串 转成32位网络大端的数据(“192.168.1.2” ==> )
参数:
af :
AF_INET IPV4
AF_INET6 IPV6
src: 点分十进制串的首地址
dst : 32位网络数据的地址
成功返回1
#include const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
功能: 将32位大端的网络数据转成点分十进制串
参数:
af : AF_INET src : 32位大端的网络数 地址 dst : 存储点分十进制串 地址 size : 存储点分制串数组的大小
返回值: 存储点分制串数组首地址
12、网络通信解决三大问题协议、ip、端口 通过命令 man 7 ip 查看 IPv4 协议的结构体
ipv4 套接字结构体
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
};
struct in_addr {
uint32_t s_addr;
};
sin_family : 协议 AF_INET
sin_portL : 端口
sin_addr : ip 地址
ipv6套接字结构体
struct sockaddr_in6 {
unsigned short int sin6_family;
__be16 sin6_port;
__be32 sin6_flowinfo;
struct in6_addr sin6_addr;
__u32 sin6_scope_id;
};
struct in6_addr {
union {
__u8 u6_addr8[16];
__be16 u6_addr16[8];
__be32 u6_addr32[4];
} in6_u;
#define s6_addr in6_u.u6_addr8
#define s6_addr16 in6_u.u6_addr16
#define s6_addr32 in6_u.u6_addr32
};
#define UNIX_PATH_MAX 108
struct sockaddr_un {
__kernel_sa_family_t sun_family;
char sun_path[UNIX_PATH_MAX];
};
通用套接字结构体
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
};
13、tcp
传输控制协议 特点 : 出错重传 每次发送数据对方都会回ACK, 可靠 建立连接 使用连接 关闭连接(1)创建套接字 API
#includeint socket(int domain, int type, int protocol);
创建套接字
参数: domain : AF_INET type: SOCK_STREAM 流式套接字 用于 TCP 通信 (字节流) SOCK_DGRAM 报式套接字 用于 UDP 通信 (字节报) protocol : 0
成功返回文件描述符,失败返回-1
使用 man socket 命令查看创建 套接字API 的方法(2)连接服务器
使用 man connect 命令查看 连接 若提示 “无 connect 的手册条目”,则执行命令 sudo apt-get install manpages-posix-dev
#includeint connect(intsockfd , const struct sockaddr *addr, socklen_t addrlen);
功能: 连接服务器
sockfd : socket套接字 addr : ipv4套接字结构体的地址 addrlen: ipv4套接字结构体的长度
eg:



