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

网络初阶——运输层:TCP 协议(Part2)

一、文件与 socket 的关系

所以从上图可以看出,文件描述符是可以通过多个箭头来访问 socket 和报文的。 而且,其中 struct udp_socket 和 struct tcp_socket 相当于继承了基类 struct socket ,同时 struct proto_ops 和 file_operations 表面上看只是存函数指针的,但其实就是 C 语言版的多态。

二、 再谈报文

1、如何管理报文

1.1. 报文的描述

tail:报文有效载荷部分中已存数据的结尾。

end:报文有效载荷部分的结尾。

head:报文的开头。

data: 报文已存数据的开头。

1.2. 报文的组织( struct sk_buff_head )

接收/发送缓冲区

2、如何给报文加减报头

由网络基础可知,应用层的数据是由上到下不断加报头,然后到数据链路层再发送的。而当我们知道报文是上面那样的数据结构时,操作系统怎么给报文加报头呢?其实操作系统会在 char 数组开始处再开一段空间,来存放该层的报文,然后再把 head 指针和 data 指针都往上移,就完成了。所以,其实报文的封装和解包本质上只要移动 head 和 data 指针就可以了。

但是你或许会问:既然报文的数据结构是双链表节点,且 TCP 一发就把整个报文发了,那么 TCP 又是怎么按字节流发送呢?其实下图数据部分只增不减只是一种情况。当 http 报文传到运输层时,TCP 就会先算好一个 TCP 报文的有效载荷的大小,如果有效载荷比 http 报文大,那么这个 http 报文就不会被分成多个 TCP 报文节点;但如果有效载荷比这个 http 报文小,那么这个 http 报文节点就会被分成多个 TCP 报文节点;然后 TCP 会给每个报文节点编号。

报文实质封装过程

 


http://www.kler.cn/a/394693.html

相关文章:

  • HarmonyOS NEXT 实战之元服务:静态案例效果---查看国内航班服务
  • 数学建模助力干细胞研究,配体纳米簇如何影响干细胞命运
  • 运行Zr.Admin项目(后端)
  • 【 CSS 】sass 扩展语言的安装
  • 【LeetCode 面试经典150题】详细题解之矩阵篇
  • 【星海随笔】删除ceph
  • docker构建jdk11
  • 拆解测试显示Mac Mini (2024)固态硬盘并未锁定 互换硬盘后仍可使用
  • Spring Data Redis常见操作总结
  • 深度学习之pytorch常见的学习率绘制
  • 【模块一】kubernetes容器编排进阶实战之etcd的介绍与使用
  • 基于树莓派的日志抓取工具制作
  • ssh和nfs
  • Vue之插槽(slot)
  • 力扣 LeetCode 344. 反转字符串(Day4:字符串)
  • 力扣889:根据先序和后序遍历构造二叉树
  • Spring Boot与Quartz定时任务集成:深入指南
  • Ubuntu中使用纯命令行进行Android开发
  • 【SQL】一文速通SQL
  • Spring Boot驱动的电子商务平台开发
  • 【go从零单排】SHA256 Hashes加密
  • 【已解决】git push一直提示输入用户名及密码、fatal: Could not read from remote repository的问题
  • 使用ensp配置单臂路由、静态路由,实现PC互相通信。
  • golang 实现比特币内核:从公钥创建wallet地址
  • 【缓存策略】你知道 Write Through(直写)这个缓存策略吗?
  • MySQL 的主从复制数据同步