目录
一、套接字
1.1 基本概念
套接字(Socket)是计算机网络编程中用于实现进程间通信(IPC)的编程接口。它是对网络底层通信协议(如 TCP/IP 或 UDP)的抽象,让程序员可以通过简单的 API 实现数据传输,而无需关心底层网络细节。
socket是操作系统提供的网络编程接口,用于实现进程间通信IPC。通过socket,程序可以发送和接收数据
工作原理:
socket基于客户端——服务器(C/S)模型:
服务器创建socket并绑定到特定地址和端口,等待客户端连接。
客户端创建socket并连接到服务器的地址和端口,发起通信。
1.2 连接流程
1. 服务器初始化
创建socket
绑定地址和端口bind
监听连接listen
接受客户端连接accept
2. 客户端初始化
创建socket
连接服务器connect
3. 数据传输
双方通过send和recv发送/接受数据
4. 关闭连接
使用close关闭socket
1.3 套接字的类型
根据传输层协议socket分为俩种类型
1. TCP Socket(面向连接的)
可靠,有序,基于字节流的
适合传输大量数据 如文件,网页
2. UDP Socket (无连接的)
不可靠,无序,快速
适合实时应用如视频游戏
二、IP地址
ip地址是互联网通信的基础,用于唯一标识网路中的设备。用于在网络上进行数据包的传输和路由器的选择
IP 地址是互联网的 “门牌号码”,通过它实现了设备间的通信和数据交换
ip地址是分配给网络设备(计算机,手机,路由器)的32位IPV4或128位I0PV6数字标识符。用于在网络中定位和通信
当你连接到互联网上时,你的设备会被分配一个ip地址,以便在网络上唯一标识和定位你的设备·
1. ipv4
格式:点分十进制(如192.168.1.1)
范围:0.0.0.0到255.255.255.255
2. ipv6
ipv4地址枯竭,ipv6提供无限的地址空间,用于解决ipv4地址空间不足的问题
格式:冒分十六进制(如 2001:0db8:85a3:0000:0000:8a2e:0370:7334
)
3. ip地址组成
ipv4:通过子网掩码划分
网络地址:用于标识所连接的网络
主机地址:标识具体的设备
- 示例:
192.168.1.100/24
中,- 网络地址:
192.168.1
- 主机地址:
100
- 网络地址:
4. 特殊的ip地址
回环地址:127.0.0.1(本地主机)
广播地址:255.255.255.255(向所有设备发送数据)、
获取ip地址
- Windows:
ipconfig
命令。 - Linux/macOS:
ifconfig
或ip addr
命令。
三、端口号
概念:端口号是计算机网络中用于区分同一设备上不同应用程序或服务的数字标识。在一台设备上,多个应用程序可以同时通过网络收发数据
端口号用于标识数据应该被哪个应用程序接受和处理。端口号是网络通信的核心机制之一,通过它实现了同一设备上多个应用程序的并行通信。
ip地址确定设备位置,端口号确定应用程序
IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程;
一个端口号只能被一个进程占用
IP + 端口:完整的 “网络地址”
例子:你用手机刷抖音
-
IP 地址:抖音的服务器有一个公网 IP(比如
116.253.169.10
),就像抖音公司的 “小区地址”。 -
端口号:服务器用某个端口(比如 80 或 443)提供视频服务,就像抖音公司里的 “视频播放室” 门牌号。
-
组合起来:你的手机通过
116.253.169.10:443
找到抖音服务器的 “视频播放室”,获取视频数据。
IP 地址和端口号就像你网购时的「收货地址」和「房间门牌号」
- 一个小区里有上千户人家,只知道小区地址(IP)不够,必须有房间号(端口)才能找到具体的人。
- 同一台服务器可以运行多个服务(比如同时提供网页、文件下载、聊天功能),每个服务用不同端口区分。
- IP 地址:找到网络中的 “小区”(设备)。
- 端口号:找到小区里的 “房间”(应用程序)。
- 记住类比:就像快递必须有 “小区地址 + 房间号” 才能准确送达,网络通信必须有 “IP + 端口” 才能精准连接。
四、socket
IP+Port 就能表示互联网中唯一的一个进程。所以,通信的时候,本质是两个互联网进程代表人来进行通信。所以网络通信的本质就是进程间通信。ip+port叫做套接字socket
4.1 网络字节序
是计算机网络中用于数据传输的字节顺序标准,确保不同架构的设备能正确的交换二进制数据
字节序:指多字节数据在内存中的存储顺序
网络字节序:统一规定为大端序,即高位字节在前,低位字节在后
主机字节序分为:1大端序:数据的最高有效字节存储在最低的内存地址
整数 0x12345678
的存储顺序为 0x12是最高有效字节存在最低位
内存地址递增 →
[0x12] [0x34] [0x56] [0x78]
2 小端序:数据的最低位字节存在最低内存地址
整数 0x12345678
的存储顺序为:
内存地址递增 →
[0x78] [0x56] [0x34] [0x12]
主机字节序和网络字节序的关系
跨设备通信:当俩台字节序不同的主机通信时,直接传输多字节数据会导致数据解析错误
解决方案:字节序转换
发送端:将数据将小端序主机字节序转换为网络字节序(大端序)
接收端:将数据从网络字节序转换回小端序主机字节序
转换函数
#include <arpa/inet.h>
// 主机字节序 → 网络字节序(大端)
uint16_t htons(uint16_t host_short); // 16位(如端口号)
uint32_t htonl(uint32_t host_long); // 32位(如IP地址)
// 网络字节序 → 主机字节序
uint16_t ntohs(uint16_t net_short); // 16位
uint32_t ntohl(uint32_t net_long); // 32位
在发送数据前调用使得主机字节序转换为网络字节序
htons()转换为16位整数,端口号
/htonl()转换为32位,ip地址序列号
,接收数据后调用从网络字节序转换为主机字节序ntohs()
/ntohl()
h:Host主机
n:network 网络
s:short16位
l:long32位
4.2 socket套接字地址结构
1. 通用地址结构
socket网络编程接口中表示socket地址的时结构体sockaddr
struct sockaddr {
sa_family_t sa_family; // 协议族(2字节)
char sa_data[14]; // 地址数据(14字节)
};
sa_family
:
- 类型:
sa_family_t
(通常为uint16_t
)。- 取值:
AF_INET
:IPv4 协议。AF_INET6
:IPv6 协议。AF_UNIX
:UNIX 域套接字(本地通信)。- 其他:如
AF_PACKET
(原始套接字)等。
sa_data
:
- 存储具体的地址数据(如 IP 地址、端口号)。
- 长度固定为 14 字节,但不同协议族的解析方式不同。
2. 专用socket地址结构
ipv4:
// 服务器绑定
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET; //协议族
server_addr.sin_port = htons(8080);//端口号
server_addr.sin_addr.s_addr = INADDR_ANY; // ipv4地址结构 监听所有接口
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
struct sockaddr_in
:处理 IPv4 地址,需注意字节序和填充字段。struct sock