当前位置: 首页 > news >正文

【网络基础】深入理解 TCP/IP 协议体系

前言

在网络编程的世界里,TCP/IP 协议是构建一切网络应用的基石。本节将从应用层到传输层,逐步拆解 HTTP、UDP、TCP 等核心协议,并结合实践案例帮助你建立系统的理解。这不仅是网络编程的理论基础,也是服务端开发的必备技能,更是各大公司笔试、面试的高频考点。


一、应用层:人与网络的接口

1. 什么是应用层

应用层是用户与网络通信最直接的接口。程序员编写的各种网络应用(浏览器、聊天软件、在线游戏等)都工作在这一层。

2. 协议的本质

协议就是通信双方约定的数据格式与处理规则。例如,Socket API 传输的本质是字符串,但如果需要传输结构化数据,就需要序列化反序列化来保证双方能正确解析数据。

3. 网络版计算器示例

方案一:直接发送字符串

// 客户端发送
write(fd, "1+1", 3);// 服务端解析
char buf[10];
read(client_fd, buf, sizeof(buf));

方案二:使用结构体 + 序列化

typedef struct Request {int a;int b;
} Request;typedef struct Response {int sum;
} Response;

4. HTTP 协议简介

HTTP 是最常用的应用层协议,主要特点:

  • 请求格式:首行(方法、URL、版本)、Header(键值对)、Body(可为空)。
  • 响应格式:首行(版本、状态码、解释)、Header、Body。
  • 常用方法:GET、POST。
  • 常见状态码:200、404、403、302、504。
  • 常用 Header:Content-Type、Content-Length、Host、User-Agent、Referer、Cookie 等。

5. 最简单的 HTTP 服务器

const char* hello = "<h1>Hello World</h1>";
sprintf(buf, "HTTP/1.0 200 OK\nContent-Length:%lu\n\n%s", strlen(hello), hello);
write(client_fd, buf, strlen(buf));

浏览器访问 http://[ip]:[port] 即可看到页面。


二、传输层:数据传输的保障

1. 端口号

端口号用于区分同一主机上的不同应用程序:

  • 0–1023:知名端口(如 HTTP:80, HTTPS:443)。
  • 1024–65535:动态分配端口。

2. 常用工具

  • netstat:查看网络连接与端口状态。
netstat -nltp
  • pidof:通过进程名查找 PID。
pidof nginx

三、UDP 协议:轻量但不可靠

1. 特点

  • 无连接
  • 不保证可靠性
  • 面向数据报(不会拆分/合并数据)

2. 应用

适用于实时性要求高、允许丢包的场景,如视频传输、DNS、在线游戏等。


四、TCP 协议:可靠传输的代表

1. 核心机制

  • 确认应答(ACK)
  • 超时重传
  • 三次握手 / 四次挥手(连接管理)
  • 滑动窗口(提高性能)
  • 流量控制(防止接收端过载)
  • 拥塞控制(避免网络拥堵)
  • 延迟应答、捎带应答(优化传输效率)

2. 特殊状态解析

  • TIME_WAIT:等待 2MSL 确保延迟包消失。
  • CLOSE_WAIT:服务端未正确关闭 socket 导致的状态堆积。

3. 粘包问题

由于 TCP 是面向字节流的协议,接收端无法自动识别应用层包的边界,需要应用层自己定义分隔方式。


五、TCP 与 UDP 对比

特性TCPUDP
可靠性高(确认应答、重传)低(可能丢包)
连接方式面向连接无连接
速度较慢
适用场景文件传输、重要消息实时通信、视频流

六、实验与调试工具

1. listen 参数的影响

listen 的第二个参数影响全连接队列长度,过小可能导致 SYN_RECV 状态连接积压。

2. Wireshark 抓包

通过过滤器观察 TCP 三次握手、四次挥手及数据传输过程:

tcp.port == 9090

总结

TCP/IP 协议不仅是网络通信的基础,更是程序员必须掌握的核心技能。掌握它的原理和使用方法,不仅能写出高性能网络程序,还能在定位、调试网络问题时游刃有余。

http://www.dtcms.com/a/326596.html

相关文章:

  • 秒懂边缘云|1分钟了解边缘安全加速 ESA
  • GCC C++实现Matlab矩阵计算和数学函数功能
  • 乡土诗性的多重奏鸣——儿歌《生我养我的小村庄》文学赏析
  • C5.3:发射极偏置和LED驱动电路
  • 26考研|西安电子科技大学优势学科、25考研复试线及就业质量分析报告
  • 力扣热题100-----322.零钱兑换
  • 事务的特性
  • 下一代防火墙组网方案
  • IoT/透过oc_lwm2m/boudica150 源码中的AT指令序列,分析NB-IoT接入华为云物联网平台IoTDA的工作机制
  • visual studio 2015 使用番茄助手(Visual Assist)给函数自动添加注释模板
  • WSL / Linux安装MySQL(以及注意事项)
  • 嵌入式学习的第四十八天-中断+OCP原则
  • Photoshop图层混合模式:实现图像元素透明度渐变过渡的终极指南
  • Effective C++ 条款36: 绝不重新定义继承而来的非虚函数
  • 数据结构:树与二叉树
  • ARM基础概念 day51
  • easyExcel嵌套子集合导出Excel
  • 2025第十六届蓝桥杯大赛青少组省赛C++真题(初级组和中级组)
  • MCU的设计原理
  • SNMP入门教程:Windows下编译
  • Linux811 YUM;SHELL:if else fi,for
  • 进程线程切换的区别
  • 【k近邻】 K-Nearest Neighbors算法k值的选择
  • 第4节 大模型推理内存与计算优化
  • 【FreeRTOS】任务间通讯6: 任务通知- Task Notification
  • python+requests+yaml实现接口自动化用例
  • 【软件分享】格式工厂FormatFactory便携版本(解压即用)
  • 介绍一下jQuery的AJAX异步请求
  • Salesforce案例:零售企业会员积分体系
  • 新人如何简化学习Vue3文件