谈谈HTTP2.0中的二进制分帧
帧的概念在我们的计算机网络课本中,是数据链路层的定义。
所谓数据帧(Data frame),就是数据链路层的协议数据单元,它包括三部分:帧头,数据部分,帧尾。其中,帧头和帧尾包含一些必要的控制信息,比如同步信息、地址信息、差错控制信息等;数据部分则包含网络层传下来的数据,比如IP数据包,等等。
在网络分层架构中,最底层物理层负责比特流的传输,就是根据电流强弱进行数模转换。再上一层的数据链层,传输数据帧,广泛使用的链路层协议以太网定义了MTU为1500,这个限制限制了整个网络中数据包的大小。链路层封装网络层的数据包Packet为Frame,网络层封装传输层的报文Segment为Packet,传输层再封装应用层的消息Message为Segment。网络中实际传输的数据结构为:
[Frame头][IP头][TCP头][应用层DATA][Frame尾]
1500MTU的限制,抛去每一层的头部控制信息,留给data层的大小大概有1450左右字节大小,按照汉字3个字节,大概一个报文中可以传输一篇岳阳楼记(300字左右)。当应用层的数据过大时,就需要进行报文的分片与重组,这个过程由ip层来完成,ip的重组还是蛮耗时的,所以我们应用层设计中数据应该尽量控制一个数据包就可以传输。
我们之前的网络协议的设计中,由物理层,链路层,网络层,传输层来负责数据在网络中的传输,而应用层只需要直接将它的数据send&recv到socket即可,那为什么在HTTP2.0中却又在应用层设计出了帧呢? 因为我们目前的网络设计的并不好。网络如果可以重新设计,一定不会是这个样子,但是作为已经广泛使用的基础设施,已经没有了机会,所以只能在应用层来做手脚。