从一个HTTP请求来读懂HTTP、TCP协议


从一个HTTP请求来读懂HTTP、TCP协议

文章插图
作者公众号:org_yijiaoqian
从一个HTTP请求来看网络分层原理 
两台主机间会通过非常多网络设备,不管哪个网络设备都会发生数据丢失,如果发生数据丢失的话,会发生数据重传,会出现数据重复(之前丢失的包并不是丢失而是产生了延时) 。数据传输的介质也可能多样,如内网里通过网线进行传输,连接到公网的话会通过光纤进行连接,所以要实现不同介质间信号的转换,还有从光纤到路由器无线脉冲转换,距离远的话还有信号衰减问题 。所以在网络传输过程中有非常多的问题需要解决,把问题分组分层,不同层次间解决不同问题,不同层次间定义标准化接口让它们间可以进行数据的通信 。
 
复杂的网络
从一个HTTP请求来读懂HTTP、TCP协议

文章插图
 
为了简化网络的复杂度,网络通信的不同方面被分解为多层次结构,每一层只与紧挨着的上层或者下层进行交互,将网络分层,这样就可以修改,甚至替换某一层的软件,只要层与层之间的接口保持不变,就不会影响到其他层 。
    • OSI( Open System Interconnection Reference Model): 开放系统互联参考模型
    • TCP/IP 协议族
 
OSI七层理论体系结构
从一个HTTP请求来读懂HTTP、TCP协议

文章插图
 
  1. 物理层:解决两台主机的通信问题—A往B发送比特流(0101),B能接收到这些比特流 。定义了物理设备的标准如网线的类型,光纤的接口类型以及传输介质的传输速率等 。
  2. 数据链路层:由于物理层上的传输的比特流可能会出现错传、误传等,所以数据链路层定义了如何格式化数据即将比特流封装成帧,提供了错误检测 。
  3. 网络层:随着节点的增加,点对点通信是需要经过多个节点的,如何找到目标节点,如何找到最优路径变成为了首要需求 。所以出现了网络层,主要目的是将网络地址翻译成对应的物理地址,分组传输、路由选择,本层的传输单位是数据报(分组),本层需要注意的TCP/IP协议中的TCP协议 。
  4. 传输层:随着网络需要的进一步扩大,通信过程中需要传输大量的数据,网络可能会发生中断,为了保证传输大量文件时的准确性,需要对发送的数据进行切分,切分成一个个的segment进行发送,考虑如何在接受方拼接切分的segment组成完整的数据,以及发现丢失segment时该如何处理,需要注意的协议TCP、UDP 。
  5. 会话层:不同机器上的用户之间建立以及管理会话 。用于保证应用程序自动收发包和寻址 。
  6. 表示层:信息的语义语法,加密解密,转换翻译,压缩解压缩 。
  7. 应用层:规定双方必须使用固定长度的消息头,且消息头必须记录消息长度等信息 。需要注意的是TCP/IP协议中的HTTP协议 。

从一个HTTP请求来读懂HTTP、TCP协议

文章插图
 
TCP/IP四层模型 
是OSI的一种实现,包括应用层、运输层、网际层和网络接口层 。
从一个HTTP请求来读懂HTTP、TCP协议

文章插图
 
一个HTTP请求的分层解析流程
从一个HTTP请求来读懂HTTP、TCP协议

文章插图
 
如上图右边一个服务器部署了一个静态页面,通过Nginx部署在公网上,浏览器通过域名对它进行访问,浏览器输入域名点回车后是怎么工作的呢?
http://www.dumain.com服务端只认ip地址,浏览器将域名解析出来,看下浏览器里有没有域名对应DNS的缓存,有的话直接拿到服务端的ip地址,没有的话去本地的host文件看有没有配置,没有配置的话才会发起一个DNS请求用来获取服务器ip地址 。
 
DNS也是台服务器也有自己的ip地址,这时候应用层会构造一个DNS请求报文,应用层会去调用传输层的接口一个socket的API,DNS默认使用UDP实现数据传输,即应用层调用传输层的API,传输层会在DNS请求报文基础上加一个UDP的请求头,传输层将数据交给网络层,网络层同样在UDP请求报文基础上加IP的请求头,网络层会将IP请求报文交给数据链路层,数据链路层会将自己的mac头加上去并把对应的请求报文交给下一个机器的mac地址也会加上去,下一个机器的mac地址通过网络层ARP协议找到,ARP会发送一些请求看下你对应的ip地址的mac地址是多少,最后通过物理层物理介质传出去,通常传到路由器上.


推荐阅读