网络(4)HTTP协议与TCP并发服务器

最近学习了网络编程中的HTTP协议和TCP并发服务器,在开始新内容之前,先回顾上节课学的TCP与UDP通信,把基础捋清楚。

一、TCP 和 UDP 的区别

两者都是传输层协议,但是设计思路完全不一样:

UDP

实现机制简单,资源开销小;无连接,发送数据之前不需要建立连接;但是不安全不可靠,不保证数据一定到达,也不保证顺序。适合视频通话、直播这类允许少量丢包的场景。

TCP

实现机制复杂,资源开销更大;面向连接,通信前必须完成三次握手建立连接;提供可靠传输,会做重传、拥塞控制,保证数据完整有序到达。我们接下来要学习的HTTP协议就是跑在TCP之上。

简单来说,UDP快、轻、不可靠;TCP稳、重、可靠。

二、HTTP协议

HTTP是超文本传输协议,属于应用层协议,基于TCP实现,规定了超文本在网络中的传输流程。

C/S模型和B/S模型

  1. C/S(客户端/服务器)模型

    优点:资源存放在本地,加载速度快;不需要连接服务器,本地就可以运行。

    缺点:占用本地存储空间;不同平台需要单独编写客户端代码;资源更新需要本地升级或者打补丁。

  2. B/S(浏览器/服务器)模型

    特点:资源全部保存在服务器;新增资源不需要更新本地;每次访问都从服务器下载最新资源;只要有浏览器就可以访问,代码可以跨平台复用,不用重复开发客户端。

URL统一资源定位符

格式:协议://<主机>:<端口>/<路径>

协议:http或者https,用来指定访问资源的方式

主机:服务器IP地址,日常使用一般是域名,由DNS完成域名到IP的转换

端口:服务程序端口,HTTP默认80/8080,HTTPS默认443

路径:资源在服务器上存放的位置

HTTP完整传输流程

  1. 浏览器输入URL

  2. 浏览器向对应IP和端口发起TCP连接

  3. 发送HTTP请求报文

  4. 服务器回复HTTP响应报文

  5. 断开TCP连接

HTTP报文格式

请求报文

由请求行、首部行、空行、实体主体组成。

请求行:方法 URL 版本,常见方法GET用于获取资源,POST/PUT用于向服务器提交数据。

首部行:字段名:值,每一行以回车换行结束。

空行:CRLF,用来分隔首部和实体主体。

响应报文

由状态行、首部行、空行、实体主体组成。

状态行:版本 状态码 短语

状态码分类:

1xx:通知信息,请求收到正在处理

2xx:请求成功

3xx:重定向,需要进一步操作

4xx:客户端错误,请求语法出错

5xx:服务器端错误,服务端无法完成请求

三、TCP并发服务器模型

多线程模型

多线程可以解决TCP并发问题。但每个线程都占用独立栈空间,能够创建的线程数量有限。如果并发客户端数量过大,系统存在崩溃风险,实际开发一般搭配线程池使用。

1、四种IO模型

  1. 阻塞IO:没有数据时,CPU将任务挂起,不占用CPU资源,效率高。我们基础socket编程大多使用阻塞IO。

  2. 非阻塞IO:没有数据时,CPU依然会循环轮询检查数据是否到来,会消耗CPU。

  3. 信号驱动IO(异步IO):把文件描述符设置为异步IO,内核监测事件,事件发生后发送信号通知用户层处理。

  4. 多路复用IO:select、epoll,用来同时监听大量文件描述符。

2、select

select可以监听一组文件描述符集合,当集合中至少一个fd产生事件,select就会返回。

配套宏函数:

FD_CLR:清除集合中的fd

FD_ISSET:判断fd是否还在集合

FD_SET:把fd加入集合

FD_ZERO:清空集合

select函数监听fd集合,返回就绪fd数量;超时参数设置为NULL代表阻塞等待。

缺点:fd数量存在上限;fd集合在用户空间,每次需要拷贝;仅支持水平触发;需要手动遍历找出就绪fd。

3、epoll

epoll是Linux下高性能多路复用方案,三个核心接口:

  1. epoll_create:创建epoll内核事件表,返回epoll文件描述符。

  2. epoll_ctl:操作事件表,支持ADD添加、MOD修改、DEL删除事件。

  3. epoll_wait:等待事件发生,返回就绪事件的数量。

epoll支持水平触发和边沿触发,默认水平触发。

4、select与epoll对比

select

  1. 监听fd集合是数组,存在数量上限

  2. fd集合位于用户空间,事件发生需要拷贝,资源开销大

  3. 只支持水平触发

  4. 需要手动遍历查找就绪fd

epoll

  1. 监听事件表在内核中,没有fd数量上限

  2. 无需频繁拷贝用户态内核态数据,开销小

  3. 支持水平触发、边沿触发两种模式

  4. 直接返回就绪的fd,不需要遍历全部集合

网络编程的底层逻辑,就是通过socket进行数据收发,面对大量并发连接,就需要借助多路复用IO提升服务器处理能力。TCP/UDP是底层传输基础,HTTP是上层应用协议,把这些知识点串联起来,才能理解完整的网络通信过程。

相关推荐
虎头金猫6 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
wuyk5556 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
XUEYUAN52126 天前
ASN 自治系统号风控:平台如何通过 IP 所属自治域批量识别代理流量
python·网络协议·http·网络安全·socks5
QYRdata6 天前
年均增速24.2%!机器人数据湖未来六年增长动能强劲
网络·机器人·服务发现
CHENKONG_CK6 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
chshang19926 天前
工业路由器是什么?浅谈5G工业网络中的IR602
网络·物联网·5g·智能路由器
萧瑟余晖6 天前
Netty 核心组件与 Reactor 模型详解
网络·架构
ITxiaobing20236 天前
IP 定位服务选型指南:从准确率到工程落地的技术考察
linux·服务器·网络
wuyk5556 天前
【Socket 进阶之路】第 9 章 Linux 网络服务量产稳定性优化|心跳保活、TIME_WAIT、SO_LINGER、内存池、断线重连、完整异常防护框架
linux·服务器·开发语言·网络·物联网
z落落6 天前
C#UDP+串口服务端+UDP 客户端(含 CRC16 校验)
网络·网络协议·udp