
协议为什么存在协议栈、IP 与 MAC、缓冲区里的生产者消费者我的github(https://github.com/xcx55/ubuntu-linux-project)感谢各位大佬参观我的github源笔记http326-9-10学 HTTP 学到一半这篇笔记突然掉头往下挖为什么需要协议协议栈为什么叫栈IP 和 MAC 各管什么发送缓冲区为什么是生产者消费者模型这些问题平时不敢问手搓过协议之后终于有底气问了。一、为什么需要协议反着问计算机之间不约定行不行——不行。计算机本身就是一种协议、一种约定——CPU 的指令集、总线的时序、文件的格式全是约定具体到通信发给谁保证传输控制特性等等——传输需要协议处理数据也需要协议还有一个精妙的说法消息是临界资源。缓冲区里的数据被两个人用户和内核共同读写没有约定就会乱套。而手搓过协议之后你对协议的描述会变得更精确协议 双方都认的报文格式 解析规则 行为约定。它不再是教科书上一句空话而是你亲手写过的len\r\n value \r\n。二、协议栈为什么叫栈因为报头的添加和拆除类似栈的加减发送方向数据从应用层往下走每过一层就压入一层报头应用层加包 → TCP 报头 → IP 报头 → MAC 帧——像 push接收方向数据从底层往上走每过一层就弹出对应报头、解析后交给上层——像 pop。每一层协议收到数据后怎么解包只需要回答两个问题怎么分离——报头和有效载荷怎么分开定长报头自描述字段分隔符交给谁——载荷里的内容该交付给上层的哪个协议IP 报头里的上层协议字段、TCP 报头里的端口号都是在回答这个问题。这两个问题是每一层的通用考题从链路层一路问到应用层。三、IP 与 MAC目标不变接力棒一直在换一个反直觉的事实IP 不变但 IP 指向的中转站——MAC 帧——是一直在变化的。IP 只是目标数据包从你的电脑到太平洋对面的服务器路上要跳过很多路由器每跳一跳源 MAC 和目的 MAC 就被换一次这一段的接力棒但源 IP 和目的 IP 从头到尾不变终点不变。IP 地址只需要4 个字节就能表示还可以做一个推断通过发送去那里的目的 IP推断其目的 IP 是不是当前局域网的——网段一比对就知道对方是本网段还是外网这直接决定了是直接投递还是交给网关。网络层屏蔽底层网络差异为什么要发明 IP 这一层往历史看先有局域网后有广域网每一个局域网发明的技术是不一样的以太网、令牌环……后面广域网出来了要全世界互联必然要规避这种差异所以分工定了底层数据链路层保证局域网的实现网络层 IP 协议保证广域网的实现网络层以上大家都是 IP 协议一样——让我们程序员看待网络一切皆 IP。一句话网络层屏蔽了底层网络的差异。底层是什么类型的网络无所谓IP 层以上统一世界观。再补一条时间线先有 MAC 地址才有 IP 地址——网卡出厂全球唯一是硬件层的事IP 是后来为了组大网而设计的逻辑层。至于路由怎么找到全网唯一的 IP靠逐跳转发 路由表目的网段 → 下一跳目标 IP 不变接力棒一棒一棒传过去。插一句随手记为什么使用大端因为大端比较利于人类——高位在前的顺序和人类读数字的顺序一致抓包打印出来一眼能对上。四、缓冲区又一个生产者消费者模型发送和接收数据各有两个缓冲区。以发送缓冲区为例进程向里面写数据操作系统往里面读数据——生产者消费者模型所以两个主机之间跑 TCPTCP 是由 4 个生产者消费者模型构成的每台主机发送缓冲区一个 接收缓冲区一个。这个过程和文件何其相似——一切皆文件网络缓冲区文件内核缓冲区用户做什么向缓冲区写数据write 到内核缓冲区内核做什么创建线程把数据发送到网卡异步线程把数据刷入磁盘何时刷用户管不管管不了OS 决定管不了OS 决定同步约束OS 往里放的时候用户不能写OS 读的时候用户最好别读同左我们写文件也只是写到内核缓冲区后面操作系统什么时候刷到磁盘自己决定——内核缓冲区将数据刷入磁盘走的是异步线程网络这边一模一样网络协议栈就是创建了一个线程把数据发送到网卡文件系统线程则是把数据给到磁盘所以规则也一样1、操作系统往里面放的时候用户不能写2、操作系统往里面读取的时候用户最好不要读——这就是 read/write 阻塞的又一层解释。线程章的同步互斥、文件章的缓冲区、网络章的收发缓冲区——三个章节一个模型。五、报头与可拓展性最后收回到协议本身因为 TCP 是面向字节流的所以我们需要添加报头就是多了一些字段每一次 read 都要依据这个报头来决定怎么处理。而只要报文结构里有类型长度这些字段序列化和反序列化就有拓展性——新功能加字段老代码照样能解析老报文。这就是协议设计的余量思维。总结协议 约定传输需要它处理数据需要它因为消息是临界资源手搓过协议才有资格精确描述它协议栈的栈报头层层压入、层层弹出每层解包只需回答怎么分离和交给谁IP 不变MAC 一直在换IP 是目标MAC 是接力棒4 字节 IP 还能推断是否本局域网网络层屏蔽底层差异先有局域网后有广域网链路层保局域网、IP 保广域网程序员眼里一切皆 IP先有 MAC 后有 IP每个缓冲区都是生产者消费者模型TCP 两主机 4 个模型网络发网卡 ≈ 文件刷磁盘都是异步线程OS 说了算面向字节流 → 加报头 → 每次 read 依据报头 → 序列化反序列化有拓展性。回到 HTTP下一篇把请求和应答的报文格式全部铺开看。