一、网络设备基础
- 交换机与路由器
-
- 交换机:用于局域网(LAN)内的数据转发,基于MAC地址实现二层通信。
- 路由器:连接局域网与外网(如Internet),基于IP地址实现三层(网络层)路由转发。
二、IP地址与子网划分
- IP地址概述
-
- 定义:Internet中主机的唯一标识,32位(IPv4)或128位(IPv6)。
- 组成:源IP与目的IP地址,用于数据包路由。
- 表示形式:点分十进制(如202.38.64.10),最终转换为32位无符号整数。
- IP地址分类(IPv4)
-
- A类(1.0.0.0-126.255.255.255):网络号1字节,主机号3字节,用于大型网络。
- B类(128.0.0.0-191.255.255.255):网络号2字节,主机号2字节,用于中型网络。
- C类(192.0.0.0-223.255.255.255):网络号3字节,主机号1字节,用于小型网络。
- D类(224.0.0.0-239.255.255.255):多播地址。
- E类(240.0.0.0-255.255.255.255):保留地址。
-
- 子网掩码与地址拆分
-
- 功能:划分网络号与主机号,格式为32位二进制,前半段全1(网络部分),后半段全0(主机部分)。
- 计算:
-
-
- 网络号 = IP地址 & 子网掩码
- 主机号 = IP地址 & (子网掩码取反)
-
-
- 示例:C类地址192.168.1.0/24,主机范围192.168.1.1~192.168.1.254(排除网络地址和广播地址)。
三、网络体系结构
- OSI七层模型
-
- 物理层:传输比特流(0/1),定义物理信号与接口。
- 数据链路层:封装帧,实现相邻节点通信(如MAC地址)。
- 网络层:处理IP地址,实现路由选择(路由器工作层)。
- 传输层:端到端通信,提供TCP/UDP协议(端口号标识进程)。
- 会话层:管理通信连接的建立与断开。
- 表示层:数据格式转换、加密解密(如HTTP编码)。
- 应用层:定义具体应用协议(HTTP、FTP、DNS等)。
- TCP/IP协议体系结构
-
- 应用层:HTTP、FTP、DNS、SMTP等。
- 传输层:TCP(面向连接,可靠)、UDP(无连接,不可靠)。
- 网络层:IP、ICMP、路由协议(RIP、OSPF)。
- 网络接口层:物理层与数据链路层的整合(如以太网、PPP)。
四、传输层协议:TCP vs UDP
- TCP协议
-
- 特点:面向连接、全双工、可靠传输(重传机制、流量控制)。
- 适用场景:大文件传输、需要可靠性的场景(如HTTP、FTP)。
- UDP协议
-
- 特点:无连接、不可靠、高效(无需建立连接)。
- 适用场景:实时通信、小数据传输(如DNS查询、视频流、VoIP)。
五、Socket编程基础
- Socket概述
-
- 定义:网络编程接口,用于跨主机进程通信,本质是特殊文件描述符。
- 类型:
-
-
- 流式套接字(SOCK_STREAM):基于TCP,可靠连接。
- 数据报套接字(SOCK_DGRAM):基于UDP,无连接。
- 原始套接字(SOCK_RAW):直接访问底层协议(如IP、ICMP)。
-
- 端口号与字节序
-
- 端口号:16位整数,标识主机中的进程(0~65535),分为:
-
-
- 知名端口(1~1023):系统保留(如80端口用于HTTP)。
- 注册端口(1024~49151):用户程序使用。
- 动态端口(49152~65535):临时分配。
-
-
- 字节序:
-
-
- 主机字节序(小端序或大端序)与网络字节序(大端序)的转换函数:
-
-
-
-
htonl()
/htons()
:主机字节序转网络字节序。ntohl()
/ntohs()
:网络字节序转主机字节序。
-
-
- TCP编程流程
-
- 服务器端:
-
-
socket()
:创建套接字。bind()
:绑定IP地址与端口号。listen()
:设置被动监听状态。accept()
:阻塞等待客户端连接,返回通信套接字。recv()
/send()
:接收/发送数据。close()
:关闭套接字。
-
-
- 客户端:
-
-
socket()
:创建套接字。connect()
:发起连接请求。send()
/recv()
:发送/接收数据。close()
:关闭套接字。
-
- 关键函数详解
-
socket(int domain, int type, int protocol)
:创建套接字,domain
为协议族(如AF_INET),type
为套接字类型。bind(int sockfd, struct sockaddr *addr, socklen_t addrlen)
:绑定地址结构(如struct sockaddr_in
)。accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
:获取客户端连接,返回新套接字。recv(int sockfd, void *buf, size_t len, int flags)
:接收数据,类似read()
,flags
通常为0。
参考资料
- 博文:交换机与路由器基础
- Unix网络编程手册(Socket函数详解)