原文地址: 数据链路层和TCP传输层的迷思
数据链路层可以实现无差错的数据帧的交付,但是并不一定一定要实现,这个实现是需要有代价的,比如HDLC协议等等。
HDLC采用CRC校验,并且对所有的帧进行编号,通过序和确认机制,可以防止漏发和重发。事实上,HDLC是互联网初期的时候较常使用的数据链路层的协议,因为那个时候数据链路层的传输不是非常可靠。
现在使用的大部分是PPP协议,PPP协议只提供差错检测但不提供纠错,他同样使用的也是CRC校验,只能够保证无差错接收,但是由于不适用序列号和确认机制,所以无法检测重发和漏发。
如果对于所有的数据帧都使用可靠的数据链路层协议来保证数据链路层的可靠传输的话,那么无疑会极大地增加网络的负担。事实上,网络中许多的数据并不一定都需要保证可靠传输,因此随着网络的发展,数据链路层将保证数据可靠传输交由上层的传输层来控制(UDP和TCP等等)。而数据链路层大部分使用不一定可靠的PPP协议等等。
最最重要的是:传输层是端到端的,数据链路层是点到点的,想要保证端到端的可靠传输就必须在传输层做文章,仅仅在保证数据链路层各个点之间的可靠传输也不能保证上层数据的可靠性,依然会出现丢包等情况的出现。
数据链路层有差错重传和超时重传功能,但是不是所有的数据帧都需要可靠的传输。
TCP的报文封装在IP内部,在IP头部中,有两个字段,分别是IP头部长和IP总长,因此,总长减去头部长就可以得到数据部分的长度,也就是传输层封装的数据的长度,TCP的首部中包含有头部的长度,因此可以得到TCP报文的数据的部分的长度。
