Linux网络编程:TCP/UDP与HTTP协议核心笔记

Linux网络编程:TCP/UDP与HTTP协议核心笔记

目录

一、TCP粘包问题

TCP是流式传输,发送多包数据时会发生粘包,多条数据合并一起发给接收端。 解决粘包三种方案:

  1. 加延时;
  2. 设置数据边界,例如用\r\n作为数据结束标记;
  3. 定长发送,每次发送固定长度数据包。

二、TCP通信原理

TCP头部20字节固定头部,包含源端口、目的端口、序号、确认序号、标志位、窗口大小、校验和等字段。 标志位含义:

  • ACK:确认应答,ACK=1时确认序号生效
  • FIN:结束通信
  • SYN:连接请求
  • RST:重置重建连接
  • PSH:推送发送数据
  • URG:紧急加急数据

1.三次握手(建立连接)

通信前建立TCP连接

  1. 发送端发送SYN
  2. 接收端回复SYN+ACK
  3. 发送端回复ACK,连接建立完成。

2.四次挥手(断开连接)

完成通信后释放连接,无数据传输时可简化为三次挥手。

  1. 主动关闭方发送FIN
  2. 被动关闭方回复ACK
  3. 被动关闭方数据发送完毕,发送FIN
  4. 主动关闭方回复ACK,连接断开。

3.TCP核心保障机制

  1. 序号&确认序号:保证数据完整传输。序号为本包数据起始字节编号;确认序号代表接收方期待收到的下一字节序号 = 收到的序号 + 接收数据实际长度。
  2. 滑动窗口:流量控制,修改头部窗口大小字段,控制发送速率。
  3. 拥塞控制:网络带宽紧张时,自动调节发包,保障可靠通信。
  4. 掉线检测:检测长连接是否存活。

三、TCP与UDP对比

UDP(无连接)

  • 实现简单,资源开销小
  • 无连接,不可靠不安全,不保证数据送达

TCP(面向连接)

  • 实现复杂,资源开销大
  • 三次握手建立连接、四次挥手断开,安全可靠,保障数据完整有序传输。

四、HTTP协议(基于TCP的应用层协议)

1.两种模型

  1. C/S客户端/服务器模型 优点:本地资源加载快,断网本地可运行 缺点:占用本地存储空间;不同平台要单独开发客户端;更新需要本地升级。
  2. B/S浏览器/服务器模型 资源全部放在服务器;新增内容不用更新本地;只要有浏览器就可以访问,跨平台通用。

2.URL统一资源定位符

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

  • 协议:http / https
  • 主机:域名/IP,DNS将域名解析成IP地址
  • 端口:http默认80、8080;https默认443
  • 路径:服务器资源存放位置

3.HTTP完整传输流程

1.浏览器输入URL 2.浏览器和服务器建立TCP连接 3.浏览器发送HTTP请求报文 4.服务器返回HTTP响应报文 5.断开TCP连接

4.HTTP请求报文

  • 请求行:请求方法 + URL + HTTP版本
    • GET:获取服务器资源
    • POST/PUT:向服务器提交数据
  • 首部行:字段名:值格式,多个请求头;
  • CRLF空行分割头部与实体主体;
  • 实体主体:POST请求存放提交数据,GET一般为空。

5.HTTP响应报文

  • 状态行:版本 + 状态码 + 描述短语
    • 1xx:通知信息
    • 2xx:请求成功
    • 3xx:重定向
    • 4xx:客户端错误
    • 5xx:服务器内部错误
  • 响应首部行;
  • 实体主体:返回给浏览器的数据内容。
相关推荐
console.log('npc')13 分钟前
火山引擎 Ark 平台模型部署与计费配置文档
网络·火山引擎
好评12418 分钟前
【Linux】应用层协议HTTP
linux·运维·http
tang7778942 分钟前
爬虫代理池搭建全流程:从IP筛选、去重到自动切换(附完整落地代码)
爬虫·网络协议·tcp/ip·代理ip池·爬虫代理池
M78佐菲9 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
Brilliantwxx9 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
不怕犯错,就怕不做9 小时前
git prune 自动删除本地记录中那些远程已经不存在的分支引用
linux·服务器·git
weixin_4166679610 小时前
【无标题】
运维·服务器·网络
予昊11 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
一池秋_11 小时前
arm低配linux设备,桌面应用冷启动提速方法
linux·运维·arm开发