我究竟想弄明白什么事情?
我想去知道一条数据(不定长)在经历协议栈的各层都会发生什么样的变化?我想说一下我对这块的我知道的,我了解的。
1,数据链路层:去判断数据包中的目标的mac是否是自己,如果是,去掉数据链路层头,然后把数据提交上层(网络层),如果不是那么就转发,以上是收包的操作,如果是本机发包,当数据从上层提及过来,先查arp表目的是获取目标的mac,如果没查到发arping包,得到目标mac之后组装上数据链路层头,发送出去。这里补充一点,如果是二层交换机,那么数据链路层会维护一个mac学习表。如果想了解的更细节,那么请找一些mac学习的资料吧。
2,网络层:去判断数据包头目标ip是否是自己的,如果是,那么去掉ip头,然后继续往上层去提交。如果不是,那么查询自己ip路由表,找到下一跳的IP地址,然后调用数据链路层。
3,传输层:tcp,udp。tcp会在ip层的基础上有应答,重传,流量控制,滑动窗口等机制。udp就是在ip层基础上按个udp的头就发出去了。
4,应用层:自定义协议程序,http协议。ftp协议等。
以上只是两台机器之间实现相互通信各层提供基本功能说明。只是理论知识。难道发20个字节和发20000个字节经过协议栈各层的处理都是一样的么?这是我想整明白的问题。
首先我们来看数据链路层的格式

这个46-1500的范围是一个规定肯定有它渊源生动的原因,比较有意思的就是crc这个字段,就是在数据发送的最底层如果区分上一个包和下一个包。哈哈,通过一个特殊结尾标示。那么一个完整的数据包从一台机器上发出去最大为1500+18个字节,1500为数据,这1500个字节还需要包括ip包头,传输层包头。真正能发送出去的更少了。那么发送超过了各层都需要干什么?
ip层就需要分片和进行重组:
这里我们需要关注的就是ip头共有20个字节,然后会有2个字节表示ip数据的长度,2个字节的最大值2个字节的最大值-1 也就是65535.就是说ip层不会按照数据链路层来,它有允许发送的最大长度,相对于传输层来说,然后它在调用数据链路层的时候在进行对应的数据分片,在接收端在进行对应的重组。
ip层分片和重组疑惑和解答:一个很大的数据包进行分片发送的过程中会存在几个问题。
第一个问题:分片之后可能乱序到达。目前能够知道的就是根据ip头中的信息(例如位移偏移量去处理)。
第二个问题:重组的时机,如果最后一片先到了,然后其他分片后到怎么办?目前我对这里的理解就是如果有分片标示,那么应该会创建一个缓存队列,然后当收到最后一片的时候进行一下重组操作,如果没有成功,在根据一个定时器时间判断是否达到时间。然后在去进行重组,如果超时,则销毁队列。
第三个问题:如果中间有丢片的情况,那么重组就会失败,就会存在丢包问题了。
tcp层进行分段和重组:
因为tcp协议的定位是可靠性传输,但是它的下一层ip层由于包过大会进行分片进而导致丢包这种不稳定的因素。所以智慧的人类就在tcp做了一些事情,他们在tcp建立连接进行三次握手的时候就会确定一个mss的值。这个mss的值会比mtu值小一点,并且在对应的tcp头中加入了序列号,在接收端会有一个对应的缓存链表。当收到一个包就插入链表中,然后去判断这个链表的第一个和最后一个包中的标识,如果有初始和结束表示表示可以进行重组了。
补充:tcp协议头共占20个字节。这里就不对tcp协议中重传机制,应答,滑动窗口,拥塞控制去做研究了,想深入理解可以看图解tcp/ip这本书。
udp层:
对于这一层个人的理解就是在ip层的基础上加上了8个字节的udp协议头。不知道udp这一层在ip层的基础上会进行超时重传的一些处理么?这里先做为一个问题,去看书从书中找答案吧。
网友评论