[计算机网络]IP协议

●既选择了远方,便只顾风雨兼程 。
●欢迎大家有问题随时私信我!
●版权:本文由[你帅你先说.]原创,CSDN首发,侵权必究 。
为您导航2.网段划分 3.数据链路层 4.ARP协议 5.DNS
1.IP协议 1.1IP协议基本概念
IP:网络号 + 主机号
主机: 配有IP地址 。
路由器: 即配有IP地址, 又能进行路由控制 。
节点: 主机和路由器的统称 。
1.2IP协议报头
报头的标准长度为20字节 。
4位版本号(): 指定IP协议的版本,对于IPv4来说,就是4 。
4位头部长度( ): IP头部的长度是多少个32bit,也就是*4的字节数 。4bit表示最大的数字是15,因此IP头部最大长度是60字节 。(这点与TCP一样)
16位总长度(total ): IP数据报整体占多少个字节 。
8位协议: 表示上层协议的类型 。(TCP/UDP)
16位首部校验和: 使用CRC进行校验,来鉴别头部是否损坏 。
8位服务类型(Type Of ): 3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须置为0) 。4位TOS分别表示: 最小延时,最大吞吐量,最高可靠性,最小成本 。这四者相互冲突,只能选择一个 。对于ssh/这样的应用程序,最小延时比较重要 。对于ftp这样的程序,最大吞吐量比较重要 。
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64 。每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了 。这个字段主要是用来防止出现路由循环 。
分片问题:
首先,需要强调的是IP分片不是大部分情况,是一种特殊情况 。
为什么需要分片?
当数据从应用层自顶向下传输时,当传输给数据链路层时,一次传输的数据大小是有限制的,为1500字节 。
所以如果传过来的数据过大,就要进行分片 。
谁来进行组装?
对端的网络层来进行组装 。
分片过程:
首先,网络层的报头有20字节,所以传给链路层的有效载荷最多为1480字节 。
假设给网络层1500字节的数据
1500 = 1480 + 20
拆成两份数据,再分别添加20字节的报头
也就是拆成1500字节和40字节的两份数据传给链路层 。
那么问题来了,分完片之后对端主机要怎么进行组合?
这里就用到了报头里的16位标识,不同报文有没有分片标识符是不一样的 。如果有分片,标识符是一样的,这样就能把一个个分片聚在一起,那要怎么保证按正确的顺序把分片拼起来?这就用到了13位片偏移,我们来看张图看看是怎么使用的 。
所以片偏移就是相对于起始位置偏移的字节量 。
我们也发现片偏移 + 自身报文长度 = 下一个分片的开始。
小结一下:16位标识先是把分片聚在一起,然后按偏移量的升序进行排序,最终把分片组合到一起 。
问题又来了,在传输过程中怎么知道报文有没有丢?
如果是分片的第一块,我们很好判定,如果没有偏移量为0的分片则说明丢了 。
如果是中间某些分片丢了,我们可以通过当前分片的自身长度加上偏移量是否等于下一个分片的偏移量来判断有没有丢 。
前面两种情况都比较好处理,最担心的是最后一片分片丢弃了,这要怎么处理?可能很多人会想利用16位总长度进行判别,但当你把报文分片之后,加上报头,16位总长度描述的则是每个分片的总长度 。所以这就用到了我们最后一个属性,3位标志 。
3位标志:1位保留,1位标识禁止分片,1位标识更多报文 。更多报文这一位如果为1表示后面还有,为0则表示后面没有 。所以只要我收到了这个标识符置为1的分片,则表示最后一个分片我收到了 。
问题又来了,那么对端怎么区分分片和独立的报文?相信大家很容易想到片偏移为0且更多分片标志位为0的报文就是独立报文 。