网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
因此IP是这样分离报头与有效载荷的:
- 当IP从底层获取到一个报文后,首先读取报文的前20个字节,并从中提取出4位的首部长度,通过4位的首部长度便知道了IP报头的大小size。
- 如果size的值大于20字节,那么要继续从报文中读取 size - 20 字节,这一部分就是IP报头当中的选项字段。
- 读取完IP的基本报头和选项字段后,剩下的就是有效载荷了。
IP就是通过这种“定长报头+自描述字段”的方式进行报头与有效载荷分离的。
IP如何得知要将有效载荷交付给上层的哪一个协议?
在IP报头中有一个字段叫做8位协议,该字段表示的就是上层协议的类型,IP就是根据该字段判断应该将分离出来的有效载荷交付给上层的哪一个协议的。
理解socket编程
- 在进行socket编程的时候,当一端想要发送数据给另一端时,必须要指明对端的IP地址和端口号,也就是发送数据的目的IP地址和端口号。
- 其中这里的IP地址就是给网络层的IP使用的,用于数据在网络中的路由转发,而这里的端口号就是给传输层的TCP或UDP使用的,用于指明数据应该交给上层的哪一个进程。
- 发送数据时我们不需要指明发送数据的源IP地址和端口号,因为传输层和网络层都是在操作系统内核当中实现的,数据在进行封装时操作系统会自行填充上对应的源IP地址和源端口号。
8位生存空间
报文在网络传输过程中,可能因为某些原因导致报文无法到达对端主机,比如报文在路由时出现了路由环路的问题,或者目标主机已经离线,此时这个报文就成了一个废弃的游离报文。
为了避免网络中出现大量的游离报文,在IP的报头中会有一个字段,叫做8位生存空间(Time To Live,TTL)。8位生存空间代表的是报文到达目的地的最大报文跳数,每当报文经过一次路由,这里的生存空间就会减一,当生存空间减为0时该报文就会被自动丢弃,此时这个报文就会在网络中消散。
4. 分片与组装
数据链路层解决的问题
IP能够将数据跨网络从一台主机送到另一台主机,而数据在进行跨网络传送时,需要经过一个个的路由器进行路由转发,最终才能到达目标主机。
比如要将数据从主机B跨网络传送到主机C,那么主机B需要先将数据交给路由器F,路由器F再将数据交给路由器G,如此下去,最终由路由器D交给主机C。
因此IP进行跨网络传送的前提是,先将数据从一个节点传送到和自己相连的下一个节点,这个问题实际就是由IP之下的数据链路层解决的,其中数据链路层最典型的代表协议就是MAC帧。
而两个节点直接相连就意味着这两个节点是在同一个局域网中的,因此要讨论两个相邻节点的数据传送时,实际讨论的就是局域网通信的问题。
最大传输单元MTU
MAC帧作为数据链路层的协议,它会将IP传下来的数据封装成数据帧,然后发送到网络当中。但MAC帧携带的有效载荷的最大长度是有限度的,也就是说IP交给MAC帧的报文不能超过某个值,这个值叫做