我们知道应用层的PDU是报文,最后变成物理层的比特流来传播,那么一个协议的报文格式同这个报文本身是什么关系?理解一个协议的报文格式有什么作用?简而言之,数据的发送方每层(从高层向底层下沉过程)做原始数据的封装(Encapsulation)、编码(Encode), 数据的接收方每层(从底层向高层上浮过程)做数据的解封装(Decapsulation)、解码(Decode),最终还原出原始数据,并理解原始数据的真正含义!为了使上文的文字有血有肉,还是以一个小故事做为例子。Alice访问知乎网站(https://www.zhihu.com)假设Alice第一个报文已经层层封装好了,到达网卡发送缓冲区,网卡并不需要理解这个报文是什么,代表什么含义,网卡眼中只是一串0、1组成的二进制位流。网卡需要将二进制流做封装的工作,添加以太网头、添加以太网尾(FCS)。

  • 以太网头里的源MAC,代表自己的MAC地址,6个字节。

  • 以太网头里的目的MAC,代表接收者的MAC地址,6个字节。

  • 以太网头里的Ethetype,代表着封装的是什么协议,这里为 0x0800,代表IP协议,2个字节。

  • 以太网尾的FCS,代表着帧校验码,一般为CRC校验算法,4个字节。

网卡还需要将这些0、1二进制流进行编码,什么样电流波形代表0,什么代表1,然后0、1二进制流就变成了在网线里传输的电流波形。为了使得接收方提前做好接收的准备,还需要在发这些波形前,发送8个字节(64个二进制位)的同步信号。帧与帧之间还需要时间间隙(Inter-Frame Gap),以便于接收方识别每一个帧。Okay,将视角切换到接收方,接收方的检测到完整的64位的同步信号,做好了接收的准备。忽略掉64同步位,开始接收第65位开始的信号,并按照解码规范,将其解码成0或者1,并放入接收缓冲区。在此过程中,一旦接收到完整的目的MAC地址,和自己的MAC地址相比较,如果不同,放弃接收过程。如果相同则继续接收。接收过程一直持续到检测到空的的时间间隙(Inter-Frame Gap),这个帧接收完毕。网卡首先将最末尾的32位(4个字节)提取出来,按照协议规范,这个是FCS校验码,对接收到的帧(FCS除外)计算FCS校验码,看是否与提取出的FCS校验码相同。

  • 如果相同,说明帧的是完好的,可以继续处理。

  • 如果不同,说明帧出错,丢弃处理。

然后,网卡根据Ethetype = 0x0800,检索是哪个软件模块(回调函数)负责处理这个IP协议,IP模块将缓冲数据取走,并释放缓冲区。IP模块

IP模块就可以这个图片中的格式,对接收到的数据做报文格式合法性检查(Sanity Check)。只要有不合法的字段,丢弃处理。比如检查到TTL= 0,丢弃,还需要给源IP对应的主机发送ICMP出错消息。如果一切正常,IP模块提取出“Source IP”字段并查找路由表,进行路由选择,找到对应的出接口,将IP报文继续下沉到物理出接口(Outgoing Interface),物理接口按照接口的数据链路层封装类型(Ethernet /HDLC等),完成封装和编码,步骤雷同。经过N多中继路由器的接力,报文最终到达知乎服务器的IP层。IP层查找路由,发现自己就是真正的接收者,IP层提取出“Protocol”协议字段,假定“Protocol= 0x06。IP层检索为“Protocol= 0x06服务的模块为TCP模块。 IP层将IP头完全剥离,并将剥离掉IP头的数据提交给TCP模块处理。TCP模块

TCP模块同样要做报文合法性检查(Sanity Check)以及Checksum的校验工作。如果一切正常,TCP根据提取到的五元组{, , , , }来查找TCP Session ID。

  • 如果找到,将报文转交到次Session ID处理

  • 如果没有找到,且SYN = 1, 视为新建连接,创建一个新连接

  • 如果没有找到,且SYN=0,视为非法链接,发Reset处理。

假设找到Session ID, 该Session ID负责该报文头的读取处理工作,更新滑动窗口,发送确认报文。同时依据“Destination Port”来检索谁为该报文继续处理。这里“Destination Port= 443, 由TLS协议来处理,TCP剥离掉TCP头,将剩余部分提交给TLS处理。TLS模块如下图所示,TLS依据“Type”字段是“Hand Shake”、“Change_Spec”、“Alert”、“Application”其中之一,可以知道是握手报文、还是应用数据报文。

假设这里“Type” = “Application”,表示这是加密的上层数据,如灰色部分所示。TLS根据TLS Session ID检索出解密的密钥(Session Key)、HMAC Key ,将加密数据加密出来,然后完成数据的完整性校验工作。如果一切正常,解密出明文数据,在明文数据的头部,有一个字段名字叫“Application Protocol”,有HTTP 1.1,HTTP 1.2,SPDY等,TLS检索为该类型负责的模块。假定这里为HTTP 1.2。HTTP模块如下图所示,http也有自己的协议格式,规范每一个字段偏移量的意义,这通常是使用TLV(Type Length Value)来完成。HTTP模块只要将每个字段的信息提取出来,并按照协议规范的意义理解之,并做出响应的动作即可。知乎服务器看到这原来是拉取用户主页的请求,由于请求页面已经嵌入了用户的“Access Token”,完成了用户的身份认证工作,知乎服务器将用户的主页按照HTTP 1.2协议格式组织好,并返回给Alice。数据需要再次从高层下沉到底层,这个过程和上浮过程是逆向的,如果理解了上浮过程,那么这个下沉过程就非常好理解!

http报文格式_理解数据通信协议的报文格式有何用?相关推荐

  1. 数据包格式_理解MQTT协议数据包结构

    在本教程中,我们将更详细地介绍MQTT协议,以及MQTT消息或数据包的格式. 我们将研究: MQTT消息格式. MQTT消息头 消息字段和编码 控制消息编码示例 介绍 MQTT是基于二进制的协议,控制 ...

  2. python分析数据的相关性质_理解数据的性质_Python数据分析实战应用_数据挖掘与分析视频-51CTO学院...

    为什么学Python: 重要:数据分析是职业技能必备,Python是大数据分析** 趋势:Python是目前非常火的编程语言,使用人多 好学:学习简单,容易上手,使用灵活,可扩展强 **:会Pytho ...

  3. Java读取mapinfo格式_求助:如何把mapinfo格式的地图数据放到网页中显示

    声明,我可不是做广告哦 mapXtreme Java,是目前用于Internet或企业Intranet唯一的100%纯Java地图服务器.mapInfo mapXtreme Java与J2EE兼容,为 ...

  4. vue数据定义格式_用好单元格自定义格式,让Excel按照你的要求显示数据

    [温馨提示]亲爱的朋友,阅读之前请您点击[关注],您的支持将是我最大的动力!#百校助力高考加油站# Excel表格中的数据,我们通常会根据需求,选择设置单元格格式,然后再选择数据类型:数值.文本.日期 ...

  5. sql怎么导出带标题的csv格式_导出数据为csv格式

    1.创建存储过程 CREATE OR REPLACE PROCEDURE SQL_TO_CSV ( P_QUERY IN VARCHAR2, -- PLSQL文 P_DIR IN VARCHAR2, ...

  6. xml格式的word转为标准格式_保持的怎么保证Word格式不变?4个技巧需要带走

    来自word妹,侵联系删 在处理文档时,我们时常需要复制或者插入内容等,那如何保持格式不发生变化呢?本期与大家分享4个保持格式不变的Word技巧. 1.复制内容,如何保持与文本格式一致? 复制文本内容 ...

  7. python excel条件格式_关于python调用Excel“条件格式”——二探openpyxl

    熟悉我的人大概,知道我早期写过 "监控自觉系统","日报自处理程序" 日报那个程序就是有用到openpyxl 来操作Excel 不过还是要道歉本期的质量,还是第 ...

  8. 各种说明方法的答题格式_说明方法的作用答题格式

    说明方法的作用答题格式2020-02-20 10:26:50文/颜雨 举例子:具体.准确地说明了--,使说明更具体,更有说服力.列数字:科学.具体.准确地说--,使说明更有说服力,令读者信服.打比方: ...

  9. php java转换为字符串格式_在PHP中将“原始”字符串格式转换为Java UUID

    小编典典 您的问题没有多大意义,但是假设您想以Java正确的格式读取UUID,则可以执行以下操作: import java.util.UUID; class A { public static voi ...

最新文章

  1. Android NDK开发-3-环境搭建
  2. struts2+jquery之form插件实现异步上传图片并显示
  3. 解决安卓中单个dex方法数超过65535的方法
  4. JSON 之 SuperObject(6): 方法
  5. 众望所归!中国机器狗能【后空翻】了。。。
  6. 【译】 WebSocket 协议第八章——错误处理(Error Handling)
  7. python处理文本数据
  8. 【BZOJ4289】Tax,堆优化dijsktra的最短路问题
  9. 微软Skype即将抛弃Windows Phone 8和8.1用户
  10. 计算机网络知识汇总(超详细整理)
  11. Barcode模块管理条码扫描识别
  12. c语言学习指南app,c语言学习手册app
  13. 【游戏逆向】老飞飞怀恋魅力爱玩等老飞飞瞬移分析代码
  14. office安装双击setup后点击‘立即安装’无反应(闪退)
  15. 计算机视觉入门CV之街道字符识别—01赛题理解
  16. 蓝牙耳机电脑玩游戏进入没声音设置
  17. 阿里云域名注册详解与Github绑定
  18. 塔望食品品牌策划:中国鳗鱼行业市场现状及发展趋势分析
  19. 揭秘清道夫轮巡码制作流程
  20. 多用户商城系统 KgMall2.1发布!

热门文章

  1. python观察日志(part1)--字典反向查找
  2. 网络编程(part8)--传输层服务之TCP和UDP
  3. HTML基础(part7)--常用标签之超链接标签
  4. SAP 电商云 Spartacus UI Component 级别的延迟加载实现(Lazy Load)
  5. 关于 HANA CE Function
  6. Angular 应用里的 vendor.js 是用来干什么的?
  7. Angular CLI 全局 ng.cmd 文件内容分析
  8. SAP Spartacus CMSFlexComponent
  9. Angular依赖注入的一个例子和注入原理单步调试
  10. 将ABAP数据库表的定义导入到PostgreSQL