“帧“是数据链路层数据的基本单位,数据链路层接收到网络层的数据后会在这段数据的前后添加特定标记形成数据帧,接收端根据前后特定的标记来识别数据帧。
封装成帧的过程 在网络层会把一些IP数据报传输给数据链路层,数据链路层在接收到数据之后把它看作是数据帧的数据,接着在数据的前后添加标记,标识数据帧的头部和尾部。(从帧首部到帧尾部就是数据帧的长度)帧首部和帧尾部都是特定的控制字符,实际也是一些特定的比特流。 比如帧首部SOH:00000001 帧尾部EOT:00000100 对于数据帧在物理层的表现形式为001…0101的比特流。
如果帧数据里面存在比特流,通过透明传输来解决。
“透明”在计算机领域是非常重要的一个术语。比如平时设计API时如果设计的足够良好的话,底层的API操作对于API的调用方是透明的;比如对于数据链路层来说,物理层所做的工作是透明的,物理层只需要提供一些API给数据链路层使用。“一种实际存在的事物却又看起来不存在一样” 在数据链路层中即使控制字符在帧数据中,但是要当作不存在的去处理。
数据链路层是如何即使控制字符在数据里还可以当作不存在处理? 假设数据报文里面有一个EOT的控制字符,在接收端很有可能会把位于数据里面的EOT字符看作是数据帧的尾部,从而识别到一个错误的帧。这是严重的问题,如果不在底层做一些操作与改变,即使数据帧进行了传送也是无法解决的。所以必须在数据链路层进行操作使接收端不认为数据报里的比特流是控制字符。
对数据里的控制字符进行特殊的处理,在特殊控制字符前面加一个转义字符。如果数据报里面有控制字符就在前面增加ESC转义字符。接收端在接收到EOT字符的时候就会判断在它的前面是否有转义字符。如果有转义字,接收端就认为这是一个位于数据报里的EOT比特流,从而不当做数据帧的尾部处理。 同理如果数据里面出现转义字符,只需要把转义字符重新转义一次,在前面再次增加ESC即可。和编程里的转义字符原理相同。
物理层只管传输比特流,无法控制判断是否出错。如果物理层在传输比特流的时候受到干扰,如宇宙射线,闪电等。物理层无法察觉比特流的错误。因此数据链路层拥有差错检测的功能,它可以判断比特流是否有出错。