学习笔记——网络基础

网络基础模型

1. OSI七层参考模型(理论标准)

这是描述计算机网络通信功能的通用框架。理解它有助于分析任何网络协议。

  • 应用层 :直接面向用户,提供如HTTP(网页)、FTP(文件传输)、SMTP(电子邮件)、DNS(域名解析) 等服务。

  • 表示层 :负责数据格式转换,如加密解密、压缩解压,确保不同系统能理解彼此的数据。

  • 会话层 :建立、管理和终止应用程序之间的会话(对话),如断点续传

  • 传输层 :提供端到端的通信,核心是TCP(可靠、面向连接)UDP(高效、无连接) 协议。

  • 网络层 :负责将数据包从源主机路由到目标主机,核心协议是 IP(网际协议)

  • 数据链路层 :在相邻节点(如通过交换机相连)间可靠传输数据帧,处理物理地址(MAC地址)寻址和差错控制

  • 物理层 :定义物理媒介(如网线、光纤)的电气、机械特性,传输比特流

2. TCP/IP四层模型(实际标准)

这是互联网实际采用的协议族,可以看作是OSI模型的简化与实践。

  • 应用层 :对应OSI的应用层表示层会话层,包含所有高层协议。

  • 传输层 :对应OSI的传输层,提供TCP/UDP

  • 网络层 :对应OSI的网络层,核心是IP协议。

  • 网络接口层 :对应OSI的数据链路层物理层

核心协议详解

1. 应用层关键协议

  • DNS :将人类可读的域名(如 www.baidu.com 翻译成机器可识别的IP地址

  • DHCP :自动为网络中的设备分配IP地址、子网掩码、网关等配置,避免手动设置的麻烦。

  • HTTP/HTTPS:用于传输网页内容。

2. 传输层核心协议

特性 TCP (传输控制协议) UDP (用户数据报协议)
连接性 面向连接(三次握手建立连接) 无连接(直接发送)
可靠性 高可靠,提供确认、重传、排序机制 不可靠,尽最大努力交付
数据形式 字节流,无边界 数据报,有边界
速度与开销 速度相对慢,头部开销大(20字节) 速度极快,延迟低,头部开销小(8字节)
典型应用 Web浏览(HTTP)、文件传输(FTP)、电子邮件 视频流、语音通话、DNS查询

3. 网络层与接口层协议

  • IP :根据IP地址在网络中寻址和路由数据包。

  • ICMP :用于网络诊断,如 ping命令 (测试连通性)和 traceroute命令(跟踪路径)。

  • ARP :在局域网内,根据IP地址 查找对应的MAC(物理)地址

Linux网络配置与C语言Socket编程

1. 常用网络配置命令

  • ifconfig / ip addr:查看和临时配置网络接口信息。

  • ping:测试与目标主机的网络连通性。

  • netstat -anp:查看本机所有的网络连接、监听端口及对应进程。

  • 永久配置 :编辑 /etc/network/interfaces 文件,然后使用 sudo /etc/init.d/networking restart 重启网络服务。

2. C语言Socket编程核心概念

  • Socket(套接字) :网络通信的端点,本质是操作系统内核提供的一个文件描述符

  • IP + 端口IP地址唯一标识网络中的一台主机;端口号(1-65535)标识主机上的一个具体应用程序。

  • 字节序 :网络传输统一使用大端字节序 。编程时需使用 htonl(), ntohl() 等函数进行主机序(通常是小端)与网络序的转换。

3. UDP Socket编程流程与关键函数

UDP通信是无连接的,流程简单,适用于对实时性要求高、可容忍少量丢失的场景。

复制代码
服务端:创建Socket -> 绑定地址 (bind) -> 接收数据 (recvfrom) -> 关闭 (close)
客户端:创建Socket -> 发送数据 (sendto) -> 关闭 (close)

关键数据结构 (struct sockaddr_in)

复制代码
#include <netinet/in.h>
struct sockaddr_in {
    sa_family_t    sin_family; // 地址族,如 AF_INET
    in_port_t      sin_port;   // 端口号(网络字节序)
    struct in_addr sin_addr;   // IP地址(网络字节序)
};
// 设置示例
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 设置端口,htons转换为主机到网络序
inet_pton(AF_INET, "192.168.1.100", &server_addr.sin_addr); // 设置IP

核心函数

  • int socket(int domain, int type, int protocol);

    • 创建一个Socket。对于UDP,type参数应为 SOCK_DGRAM
  • int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    • 服务器调用,将Socket与本地IP和端口绑定。
  • ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

    • 发送数据 。必须指定目标地址(dest_addr)。
  • ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

    • 接收数据 。可通过 src_addr 获取发送方的地址信息。

学习与实验建议

  1. 抓包分析 :使用 Wireshark 工具抓取 ping、浏览网页时的数据包,直观观察各层协议头(以太网帧头、IP头、TCP/UDP头)的结构,这是理解理论最有效的方式。

  2. 动手编码 :按流程图完成一个简单的 UDP 回声(Echo)程序 (客户端发什么,服务器原样返回什么),再进阶为 TCP 版本,体会两者的区别。

  3. 理解"边界" :重点体会UDP的数据报有边界 与TCP的字节流无边界在编程处理上的不同(TCP需要应用层自己处理消息边界,如约定长度或分隔符)。

  4. 网络调试 :在编程时,多用 netstat 命令查看你的Socket是否在正确监听或连接。

相关推荐
草莓熊Lotso2 小时前
Makefile 完全指南:从入门到工程化,自动化构建不再难
linux·运维·服务器·人工智能·经验分享·后端·自动化
少云清2 小时前
【接口测试】2_代码实现 _设置http请求语法
网络·网络协议·http
热爱生活的五柒2 小时前
深度聚类(Deep Clustering)与度量学习(Metric Learning)的共同点和不同点
人工智能·算法·机器学习
枫叶丹42 小时前
【Qt开发】Qt事件(二)-> QKeyEvent 按键事件
c语言·开发语言·数据库·c++·qt·microsoft
ElfBoard3 小时前
ElfBoard技术贴|如何在【RK3588】ELF 2开发板实现GPIO功能复用
linux·人工智能·单片机·嵌入式硬件·物联网·机器人
崎岖Qiu3 小时前
【设计模式笔记19】:建造者模式
java·笔记·设计模式·建造者模式
旖旎夜光10 小时前
C++(17)
c++·学习
梁辰兴11 小时前
计算机网络基础:使用集线器的星型拓扑
服务器·网络·计算机网络·集线器·计算机网络基础·梁辰兴·星型拓扑
jimy111 小时前
安卓里运行Linux
linux·运维·服务器