• tcp/ip首部


    TCP/IP

    IP首部

    区分服务:如果带宽有限,我们要保证某一项业务,就在那项业务产生的报文当中标识此位,意为让路由器优先转发此类报文。

    total len指的是总长度,首部加上报文一共最大不得超过65535个字节,如果有报文真的这么大,在到达下一层数据链路层的时候会进行分片,为什么?因为数据链路层允许数据的最大字节是1500,实际上,这么大的报文是很少见的。

    报文经过分片,可以每一片通过不同的路径、不同的时候到达目的主机,那么我们怎样才能有正常的将多个数据帧重新组装成数据包呢?那后面的三个字段的作用就在于此。

    ID:一个包被切成多个片后ID是一样的,后面那三位用来表示的,MF表示后面有更多的切片,DF表示不能切片。如果一个数据包被切成多个帧的话,当接收方收到之后通过ID号就知道这几个帧是由一个包切的,要将组装起来,可以问题来了,ID号一样,谁先谁后呢?下一个字段片偏移就是为了解决这个问题。

    fragment offset片偏移量:就是说明此片在整个包当中的相对位置,同一包被切片后用来整合时使用,第一个包的偏移量一定是0,第二个切片的偏移量一定是第一个包的长度,第三个偏移量一定是第一个加上第二个的长度。

    假设一个包的长度是3820字节,假如说使用的是固定首部,那么数据部分占3800字节,如果链路层的MTU要求每一片的数据长度不得超过1400字节,那么应该分几片呢?3800/1400=2.7,取整数部分肯定是分为3片。

    第一片数据长度为1400,第二片的数据长度也是1400,第三片的数据数据长度为1000.

    第一片的数据部分的第一位是0,最后一位是1399,相对位置(片偏移量)是0(取数据部分的第一位),因为这是第一个包

    第二片的数据部分的第一位是1400,最后一位是2799,相对位置(片偏移量)是1400(取数据部分的第一位)

    第二片的数据部分的第一位是2800,最后一位是3799,相对位置(片偏移量)是2800(取数据部分的第一位)

    又因为片偏移是以8个字节为偏移单位,所以每一片的偏移量都除以8,所以:

    第一片的偏移量是:0

    第一片的偏移量是:1400/8=175

    第三片的偏移量是:2800/8=350

    protocl标志此数据包里面的数据使用的是何种协议,以便目的主机知道将此报文交给上层的哪个部分处理。

    options填充位,一些黑客就会向里面填充数据。

    校验和:只是首部,不包括数据部分,因为每经过一个路由设备都可能重新分片,都要重新计算一次各种字段。

    这里面由其要注意的就是切片机制与片偏移机制,系统优化的时候会使用

    TCP首部

    我们应该注意一点,TCP首部不像IP首部一样,TCP的没有规则首部长度的字段,这是因为tcp层在进行数据封装时是取决于接收方给出的窗口值和当前网络的拥塞状况来决定的。传输层并不关心应用程序向下交付的数据是多长,不断多长,传输层只根据接收方给出的窗口值和当前网络的拥塞状况来决定的数据部分的长度。如果应用程序只发来了很少很少的数据,远远达不到接收方的窗口给定的大小,也可以积累到足够多的字节后再构成报文发送出去。

    还有一点就是TCP首部当中有两个ACK,其中一个是确认号,另一个是确认位。确认号的作用是期望收到对方下一个报文的第一个数据字节的序号。而确认位为1的时候,确认号才会生效。序号的起点数和确认号的起点数是多少不重要,但我们一定要知道它们是如何增长的。

    双方各自维护自己的seq和ack字段:

    seq=自己发送的上一个包的seq号+自己发送的上一个包的len(自己)

    Ack=对方发送的上一个包的seq号+对方发送的上一个包的len(对方)

    序号增长是以自我为中心向外输出的,但是请你别忘了,你向外输出的同时也要肯定别人。

    传输层的首部确定的部分是20字节,加上选项和填充最大不得超过60个字节;网络层首部的确认部分也是20个字节,但加上选项和填充不得超过60个字节,链路层的固定首部长度是16字节,没有可变部分。

    传输层的数据部分没有规定是多大,取决于对方。

    网络层的数据部分造型整体长度减去首部长度,反正不可能超过65515个字节(65535-20)

    链路层的数据部分最小46字节,最大1500字节,妈的,网络层和传输层的加起来就得40个字节,最正有效的数据只有6个字节。

    如果我们想到传输层生成一段数据到数据链路层时不分片,最大应该是多少呢?应该用链路层数据部分最大长度减去网络层和传输层的固定长度(1500-20-20),也就是1460个字节。

    如果传输层的数据部分太小,比如只有1字节,那么形成数据帧起码需要浪费20+20+16个字节,利用率很低,但是如果如果传输层的数据部分太大,比如有2000字节,那么在网络层应该要被分片,而一分片之后,在合并数据时还可以会重传,开销也不小,那么我们只能取中间,也就是保证每个报文不要分片但是要达到一个报文数据部分所能达到的极限大小,也就是传输层的数据部分尽可能设置大一些,只要在IP层不分片即可,但是这个点是很难确认点,1460只能理论值,这个值是

  • 相关阅读:
    css文本在标签<text>内平均分布
    ES6实现去重,排序,加升序
    uni-app项目打包成小程序
    uni-app项目( uniapp滚动监听元素)
    运行vue项目:Module build failed: Error: Cannot find module 'node-sass'报错问题
    笨方法实现数量的输入与加一减一 、以及对边界值的判断禁用
    基于nuxt的前端商城pc端项目(bug记录)
    基于nuxt的商城项目pc端项目记录
    Vue学习笔记整理-长期更新
    程序员,不要创业!
  • 原文地址:https://www.cnblogs.com/yizhangheka/p/12357749.html
Copyright © 2020-2023  润新知