ip_ipv6 - CSDN
ip 订阅
IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。 [1] 展开全文
IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。 [1]
信息
外文缩写
IP
类    别
网络术语
类    型
通信协议
中文名
网际互连协议
外文名
Internet Protocol
版    本
IPv4、IPv6
IP简介
IP是整个TCP/IP协议族的核心,也是构成互联网的基础。IP位于TCP/IP模型的网络层(相当于OSI模型的网络层),对上可载送传输层各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层,通过以太网、令牌环网络等各种技术来传送。 [2]  为了能适应异构网络,IP强调适应性、简洁性和可操作性,并在可靠性做了一定的牺牲。IP不保证分组的交付时限和可靠性,所传送分组有可能出现丢失、重复、延迟或乱序等问题。 [1] 
收起全文
精华内容
参与话题
  • 什么是IP地址

    千次阅读 多人点赞 2019-02-03 16:41:58
    一、IP地址  在互联网中,一台主机只有一个IP地址。  IP地址用于在TCP/IP通信协议中标记每台计算机的地址,通常用于十进制来表示,如192.168.1.100,但是在计算机内部,IP地址是一个32位的二进制数值,如11000000 ...

    一、IP地址

     在互联网中,一台主机只有一个IP地址。
     IP地址用于在TCP/IP通信协议中标记每台计算机的地址,通常用于十进制来表示,如192.168.1.100,但是在计算机内部,IP地址是一个32位的二进制数值,如11000000 10101000 00000001 00000110(192.168.1.6)。
     具体来讲,一个完整的IP地址信息应该包括IP地址、子网掩码、默认网关和DNS等四部分。只有这四部分协同工作,才能与互联网中的计算机相互访问。

    1.IP地址

     一个完整的IP地址由两部分组成,分别是网络号部分和主机号部分。网络号表示其所属的网络段编码,主机号则表示该网段中该主机的地址编码。
     按照网络规模的大小,IP地址可以分为A、B、C、D、E五类,其中A、B、C类是3种主要的类型地址,D类专供多目传送地址,E类用于扩展备用地址。

    (1).A类IP地址:

     一个A类IP地址由1个字节的网络地址和3个字节的主机地址组成,网络地址的最高位必须是"0",地址范围从1.0.0.0~126.0.0.0。

    (2).B类IP地址:

     一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是"10",地址范围从128.0.0.0~191.255.255.255。

    (3).C类IP地址:

     一个C类IP地址由3个字节的网络地址和1个字节的主机地址组成,网络地址的最高位必须是"110",地址范围从192.0.0.0~223.255.255.255。

    (4).D类IP地址:

     用于多点广播(Multicast)。D类IP地址第一个字节以"10"开始,它是一个专门保留的地址;它并不指向特定的网络,目前这一类地址被用在多点广播中。多点广播地址用来依次寻址一组计算机,它标识共享同一协议的一组计算机。

    (5).E类IP地址:

     以"10"开始,为将来使用保留,全"0"(0.0.0.0)IP地址对应于当前主机;全"1"的IP地址(255.255.255.255)是当前子网的广播地址。

    2.子网掩码

     子网掩码是与IP地址结合使用的一种技术。主要作用有两个:

    1. 用于确定IP地址中的网络号和主机号;
    2. 用于将一个大的IP网络划分为若干小的子网络。

    3.默认网关

     默认网关意为一台主机如果找不到可用的网关,就把数据包发送给默认指定的网关,由这个网关来处理数据包。

    4.DNS

     DNS服务器用于将用户的域名请求转换为IP地址。

    二、查看IP地址

     计算机的IP地址一旦被分配,可以说是固定不变的。
     【命令行提示符】窗口中输入"ipconfig",按Enter键,即可显示出本机的IP配置相关信息。

    展开全文
  • 背景知识IP地址IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信。我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就相当于“电话号码”,而...

    背景知识


    IP地址


    IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信。我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就相当于“电话号码”,而Internet中的路由器,就相当于电信局的“程控式交换机”。
    IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。

    网络地址的划分

    A类,B类,C类


    概念 特征 网络范围 默认掩码
    A类地址 第1个8位中的第1位始终为0 0-127.x.x.x 255.0.0.0/8
    B类地址 第1个8位中的第1、2位始终为10 128-191.x.x.x 255.255.0.0/16
    C类地址 第1个8位中的第1、2、3位始终为110 192-y.x.x.x 255.255.255.0/24

    特殊


    D类 以1110开始 用于组播
    E类 以11110开始 用于科研保留

    范围上划分有些要注意的:
    A类 从1.0.0.0 到126.255.255.255
    B类 从128.0.0.0到191.255.255.255
    C类 从192.0.0.0到223.255.255.255
    其中127.x.x.x段地址空间是被保留的回环地址

    IP地址包含 网络地址+主机地址,即IP地址=网络地址+主机地址

    网络地址:
    1、如果是192的C段地址,那么,网络地址就是:192.168.1.0,地址掩码是:255.255.255.0。
    2、如果地址掩码是:255.255.0.0,那么网络地址就是:192.168.0.0。
    3、网络地址很大一部分是由地址掩码决定的。
    主机地址:

    如IP地址是202.112.14.137,掩码是255.255.255.224 ,

    网络地址是202.112.14.128,子网号是128。

    主机地址是202.112.14.137 。

    子网掩码


    子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。

    子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
    子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。

    子网掩码——屏蔽一个IP地址的网络部分的“全1”比特模式。对于A类地址来说,默认的子网掩码是255.0.0.0;对于B类地址来说默认的子网掩码是255.255.0.0;对于C类地址来说默认的子网掩码是255.255.255.0。

    • 通过子网掩码,就可以判断两个IP在不在一个局域网内部。

    • 子网掩码可以看出有多少位是网络号,有多少位是主机号

    网关


    网关(Gateway)又称网间连接器、协议转换器。默认网关在网络层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连

    网关实质上是一个网络通向其他网络的IP地址。

    比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。

    在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。

    而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。

    所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。那么这个IP地址是哪台机器的IP地址呢?网关的IP地址是具有路由功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。

    广播地址(Broadcast Address)


    广播地址(Broadcast Address)是专门用于同时向网络中所有工作站进行发送的一个地址。

    在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。例如,对于10.1.1.0 (255.255.255.0 )网段,其广播地址为10.1.1.255 (255 即为2 进制的11111111 ),当发出一个目的地址为10.1.1.255 的分组(封包)时,它将被分发给该网段上的所有计算机。

    根据IP地址和子网掩码求 网络地址 和 广播地址


    • 将IP地址和子网掩码换算为二进制,子网掩码连续全1的是网络地址,后面的是主机地址,虚线前为网络地址,虚线后为主机地址

    • IP地址和子网掩码进行与运算,结果是网络地址(即主机号全0是网络地址)

    • 将运算结果中的网络地址不变,主机地址变为1,结果就是广播地址

    • 地址范围就是含在本网段内的所有主机

    网络地址+1即为第一个主机地址,广播地址-1即为最后一个主机地址,
    由此可以看出地址范围是: 网络地址+1 至 广播地址-1

    • 主机的数量=2^二进制位数的主机-2

    减2是因为主机不包括网络地址和广播地址。

    示例
    一个主机的IP地址是202.112.14.137,掩码是255.255.255.224,要求计算这个主机所在网络的网络地址和广播地址

    根据子网掩码可以分割网络号+主机号


    255.255.255.224 转二进制:

    11111111 11111111 11111111 11100000

    网络号有27位,主机号有5位

    网络地址就是:把IP地址转成二进制和子网掩码进行与运算

    11001010 01110000 00001110 10001001

    IP地址&子网掩码

    11001010 01110000 00001110 10001001
    
    11111111 11111111 11111111 11100000
    
    ------------------------------------------------------
    
    11001010 01110000 00001110 10000000

    即:202.112.14.128

    计算广播地址


    广播地址:网络地址的主机位全部变成1 ,10011111 即159 即:202.112.14.159

    主机数


    主机号有5位,那么这个地址中,就只能有252=30个主机

    因为其中全0作为网络地址,全1作为广播地址

    根据每个网络的主机数量进行子网地址的规划和计算子网掩码


    这也可按上述原则进行计算。

    比如一个子网有10台主机,那么对于这个子网需要的IP地址是
    10+1+1+1=13
    注意:加的第一个1是指这个网络连接时所需的网关地址,接着的两个1分别是指网络地址和广播地址。
    因为13小于16(16等于2的4次方),所以主机位为4位。

    而 256-16=240 所以该子网掩码为255.255.255.240。

    如果一个子网有14台主机,不少人常犯的错误是:依然分配具有16个地址空间的子网,而忘记了给网关分配地址。这样就错误了,因为:
    14+1+1+1=17
    17.大于16,所以我们只能分配具有32个地址(32等于2的5次方)空间的子网。这时子网掩码为:255.255.255.224

    5) 主机的数量

    206 110 4 0/18被划分成16个子网,每个子网掩码?


    (划分成16个子网,根据子网掩码/18就表示有18个1,就要从的IP地址的主机位借4位来用作网络位!)

    子网掩码是255.255.252.0

    每个子网可以容纳的主机数是1024台。

    下面我来给你详细解答:

    206.110.1.0 /18 由最后的那个/18,我们可以知道这个IP已经规定了它的网络位是18位,它默认的子网掩码就是11111111.11111111.11 | 000000.00000000(其中1代表网络位,0代表主机位)

    可以看出我们可以操作的位数就是后面的14个0,也就是说我们可以在地面划分出几位作为子网的网络位,进而来划分子网。要求是切分成16个子网,我们知道2的4次方刚好等于16,这就说明子网网络位的位数是4位,那14-4=10就是子网的主机位。所以上面我写的那串二进制就可以变成:11111111.11111111.111111 | 00.00000000(其中1代表网络位,0代表主机位)

    ip段/数字-如192.168.0.1/24是什么意思?


    后面这个数字标示了我们的网络号的位数,也就是子网掩码中前多少号为1

    129.168.1.1 /24 这个24就是告诉我们网络号是24位

    也就相当于告诉我们了

    子网掩码是:11111111 11111111 11111111 00000000

    即:255.255.255.0

    172.16.10.33/27 中的/27

    也就是说子网掩码是255.255.255.224 即27个全1

    11111111 11111111 11111111 11100000

    附录


    16-30位网络号-掩码位数,IP总数,子网掩码查询表


    ip段/27 /29 /30 网关,子网掩码,广播地址查询
    可用IP查询,IP段对应表

    掩码位数 IP总数 子网掩码 C段个数
    /30 4 255.255.255.252 1/64
    /29 8 255.255.255.248 1/32
    /28 16 255.255.255.240 1/16
    /27 32 255.255.255.224 1/8
    /26 64 255.255.255.192 1/4
    /24 256 255.255.255.0 1
    /23 512 255.255.254.0 2
    /22 1024 255.255.252.0 4
    /21 2048 255.255.248.0 8
    /20 4096 255.255.240.0 16
    /19 8192 255.255.224.0 32
    /18 16384 255.255.192.0 64
    /17 32768 255.255.128.0 128
    /16 65536 255.255.0.0 256

    24位网络号


    24位网络号,8位主机号,可形成1个子网(C段总数),每个子网256-2台主机

    网络地址 可用IP范围 广播地址
    .0 .1-.254 .255

    25位网络号


    25位网络号,7位主机号,可形成2个子网,每个子网126台主机

    网络地址 可用IP范围 广播地址
    .0 .1-.126 .127
    .128 .129-.254 .255

    26位网络号


    26位网络号,6位主机号,可形成4个子网,每个子网62台主机

    网络地址 可用IP范围 广播地址
    .0 .1-.62 .63
    .64 .65-.126 .127
    .128 .129-.190 .191
    .192 .193-.254 .255

    27位网络号


    27位网络号,5位主机号,可形成8个子网,每个子网30台主机

    网络地址 可用IP范围 广播地址
    .0 .1-.30 .31
    .32 .33-.62 .63
    .64 .65-.94 .95
    .96 .97-.126 .127
    .128 .129-.158 .159
    .160 .161-.190 .191
    .192 .193-.222 .223
    .224 .225-.254 .255

    28位网络号


    28位网络号,4位主机号,可形成16个子网,每个子网14台主机

    网络地址 可用IP范围 广播地址
    .0 .1-.14 .15
    .16 .17-.30 .31
    .32 .33-.46 .47
    .48 .49-.62 .63
    .64 .65-.78 .79
    .80 .81-.94 .95
    .96 .97-.110 .111
    .112 .113-.126 .127
    .128 .129-.142 .143
    .144 .145-.158 .159
    .160 .161-.174 .175
    .176 .177-.190 .191
    .192 .193-.206 .207
    .208 .209-.222 .223
    .224 .225-.238 .239
    .240 .241-.254 .255

    29位网络号


    29位网络号,3位主机号,可形成32个子网,每个子网6台主机

    网络地址 可用IP范围 广播地址
    .0 .1-.6 .7
    .8 .9-.14 .15
    .16 .17-.22 .23
    .24 .25-.30 .31
    .32 .33-.38 .39
    .40 .41-.46 .47
    .48 .49-.54 .55
    .56 .57-.62 .63
    .64 .65-.70 .71
    .72 .73-.78 .79
    .80 .81-.86 .87
    .88 .89-.94 .95
    .96 .97-.102 .103
    .104 .105-.110 .111
    .112 .113-.118 .119
    .120 .121-.126 .127
    .128 .129-.134 .135
    .136 .137-.142 .143
    .144 .145-.150 .151
    .152 .153-.158 .159
    .160 .161-.166 .167
    .168 .169-.174 .175
    .176 .177-.182 .183
    .184 .185-.190 .191
    .192 .193-.198 .199
    .200 .201-.206 .207
    .208 .209-.214 .215
    .216 .217-.222 .223
    .224 .225-.230 .231
    .232 .233-.238 .239
    .240 .241-.246 .247
    .248 .249-.254 .255

    30位网络号


    29位网络号,3位主机号,可形成64个子网,每个子网2台主机

    网络地址 可用IP范围 广播地址
    .0 .1-.2 .3
    .4 .5-.6 .7
    .8 .9-.10 .11
    .12 .13-.14 .15
    .16 .17-.18 .19
    .20 .21-.22 .23
    .24 .25-.26 .27
    .28 .29-.30 .31
    .32 .33-.34 .35
    .36 .37-.38 .39
    .40 .41-.42 .43
    .44 .45-.46 .47
    .48 .49-.50 .51
    .52 .53-.54 .55
    .56 .57-.58 .59
    .60 .61-.62 .63
    .64 .65-.66 .67
    .68 .69-.70 .71
    .72 .73-.74 .75
    .76 .77-.78 .79
    .80 .81-.82 .83
    .84 .85-.86 .87
    .88 .89-.90 .91
    .92 .93-.94 .95
    .96 .97-.98 .99
    .100 .101-.102 .103
    .104 .105-.106 .107
    .108 .109-.110 .111
    .112 .113-.114 .115
    .116 .117-.118 .119
    .120 .121-.122 .123
    .124 .125-.126 .127
    .128 .129-.130 .131
    .132 .133-.134 .135
    .136 .137-.138 .139
    .140 .141-.142 .143
    .144 .145-.146 .147
    .148 .149-.150 .151
    .152 .153-.154 .155
    .156 .157-.158 .159
    .160 .161-.162 .163
    .164 .165-.166 .167
    .168 .169-.170 .171
    .172 .173-.174 .175
    .176 .177-.178 .179
    .180 .181-.182 .183
    .184 .185-.186 .187
    .188 .189-.190 .191
    .192 .193-.194 .195
    .196 .197-.198 .199
    .200 .201-.202 .203
    .204 .205-.206 .207
    .208 .209-.210 .211
    .212 .213-.214 .215
    .216 .217-.218 .219
    .220 .221-.222 .223
    .224 .225-.226 .227
    .228 .229-.230 .231
    .232 .233-.234 .235
    .236 .237-.238 .239
    .240 .241-.242 .243
    .244 .245-.246 .247
    .248 .249-.250 .251
    .252 .253-.254 .255
    展开全文
  • 网络协议 -- IP协议

    万次阅读 2018-11-25 14:15:52
    IP协议是TCP/IP协议族中最核心的协议。所有的TCP、UDP、ICMP、IGMP数据都以IP数据报的格式传输。 IP协议是不可靠、无连接的: 不可靠表示IP协议不能保证IP数据报能成功的到达目的地。IP仅提供传输服务,任何可靠...

    IP协议是TCP/IP协议族中最核心的协议。所有的TCP、UDP、ICMP、IGMP数据都以IP数据报的格式传输。

    IP协议是不可靠、无连接的:

    • 不可靠表示IP协议不能保证IP数据报能成功的到达目的地。IP仅提供传输服务,任何可靠性的要求都必须由上层来提供(如TCP)。如果传输过程发生错误,IP协议简单的丢弃该数据报,然后发送ICMP消息给发送端。

    • 无连接表示IP协议不维护任何关于后续数据报的状态信息,每个数据报都是相互独立的。这也说明,IP数据报可能不是按照发送顺序被接收到的,很有可能后发送的数据被先收到。

    一、IP首部

    IP数据报的格式如图:
    这里写图片描述

    • 4位版本:标识目前采用的IP协议的版本号。IPv4为0100, IPv6为0110

    • 4位首部长度:用于标识首部的长度,单位为4字节,所以首部的最大长度为15*4字节=60字节

    • 8位服务类型:包括3bit的优先权字段(已被忽略),4bit的TOS字段,1bit的始终为0的未使用位。

    • 16位总长度(字节数):整个IP数据报的长度。数据报中数据内容的长度=总长度 - 首部长度

    • 16位标识:唯一地标识主机发送的每一份数据报。IP数据报的最大长度可达65535字节,但大多数链路层都会对它进行分片。由于TCP本身会把用户数据分成若干片,因此这个字段一般来说不会影响到TCP。

    • 3位标志:用于IP数据报分片。该字段第1bit不使用,第2bit是DF(Don't Fragment)位,DF位设为1时表明IP不对该数据包分片。第3bit是MF(More Fragments)位,当对数据包分片时,除了最后一片外,其他每个组成数据报的片都要把此位设为1。

    • 13位偏移:用于IP数据报分片。单位为8字节。表示该片相对于原始数据报开始处的位置,能表示的最大偏移为2132^{13}*8=65536字节。

    另外,数据报被分片之后,每个片的总长度要更改为该片的长度值。IP层分片是透明的,但是即使只丢失一片数据也要重传整个数据报,因为IP层本身没有超时重传的机制。

    • 8位生存时间(TTL):设置数据报可以经过的最多路由器数量,每经过一个路由器,该值就减去1。当该值为0时,数据报就被丢弃。通常初始值为32或64.

    • 8位协议:表示上层传输层所用的协议类型。1表示ICMP协议,2表示IGMP协议,6表示TCP协议,17表示UDP协议。

    • 16位首部校验和:用于对IP首部的正确性进行校验,但不包括数据部分,这点不同于TCP和UDP的首部校验和。

    • 32位源IP地址:发送端的32bit的IP地址。

    • 32位目的IP地址:接收端的32bit的IP地址。

    • 选项:可变长度的可选信息。如果首部不含“选项字段”,则IP首部长度为20字节。

    二、IP首部校验和

    • 发送端对IP数据报的校验和的计算步骤:
    1. 把IP数据报的校验和字段置为0;
    2. 把首部看成以16位为单位的数字组成,依次进行二进制反码求和;
    3. 把求和得到的结果取反。
    4. 将第2、3步得到的2个字节数据存入首部校验和。
    • 接收端对IP数据报的校验和的校验步骤:
    1. 把首部看成以16位为单位的数字组成,依次进行二进制反码求和;
    2. 把求和得到的结果取反码。
    3. 如果结果为0,则表示检验和校验通过,IP报文没有被修改过。

    三、使用代码计算校验和

    通过wireshark抓取一帧数据报,如图:
    这里写图片描述

    以该数据报的IP首部为基础,使用C++代码来验证IP首部校验和的计算步骤和校验步骤:

    #include <assert.h>
    
    
    // GetChecksum函数用于实现上面所说的计算步骤中的第2步、第3步:
    // 把首部看成以16位(2字节)为单位的数字组成,依次进行二进制反码求和,
    // 但实际的算法实现上需要考虑取和溢出时的改进计算方法(见函数内部注释)
    //
    unsigned short GetChecksum(unsigned short* ip_header, int size) {
    	assert(sizeof(unsigned short) == 2);
    
    	// 为什么使用unsigned long(4字节)?
    	// 因为虽然首部校验和只占16位(2个字节),但执行“以16位(2字节)为单位的二进制反码数据”求和操作得到的checksum可能会超过16位(2字节),
    	// 所以这里用4个字节的unsigned long来接收相加得到的结果,后面再进行处理。
    	//
    	unsigned long checksum = 0;
    
    	while (size > 1) {
    		checksum += *ip_header; // 因为都是正数,所以反码与原码相同;故直接相加求和
    		ip_header++; // ip_header为unsigned short类型的指针每次按2个字节相加
    
    		size -= 2;
    	}
    	// 执行到这:checksum = 0x2850c
    
    	// IP首部如果不包含“选项”字段,则为20字节,偶数;如果包含了“选项”,则字节数就可能为奇数了,
    	// 这里针对字节数为奇数的情况进行处理。
    	// 注:示例main函数中构造的ip_header不含有“选项”
    	//
    	if (size == 1) {
    		checksum += *(unsigned char*)ip_header;
    	}
    
    	// 因为上面相加之后的结果大于2个字节,所以执行额外的处理步骤:
    	// checksum >> 16 右移16位
    	// 即除以2的16次方(0xffff),就是去除右边的2个字节,如:0x2850c >> 16 = 0x2
    	//
    	// checksum & 0xffff 位运算,得到后2个字节
    	// 如:0x2850c & 0xffff = 0x850c
    	//
    	// checksum = 0x2 + 0x850c = 0x850e
    	//
    	checksum = (checksum >> 16) + (checksum & 0xffff);
    
    	// 假如还大于2个字节,再次将多余的字节和checksum相加。
    	checksum += (checksum >> 16);
    
    	// 求和得到的结果的取反
    	return (unsigned short)(~checksum);
    }
    
    
    int main()
    {
    	// 将上面wirkshark抓的数据包的IP头部,使用char数组,按字节构造出来
    	//
    	unsigned char ip_header[20] = {
    		0x45, // 4位版本+4位首部长度
    		0x00, // 8位服务类型(TOS)
    		0x00, 0x1c,  // 16位总长度(字节数)
    		0x50, 0xaa,  // 16位标识
    		0x00, 0x00,  // 3位标志+13位片偏移
    		0xff, // 8位生存时间(TTL)
    		0x01, // 8位协议
    		0xf1, 0x7a, // 16位首部校验和
    		0xc0, 0xa8, 0x2e, 0x55, // 32位源IP地址
    		0xee, 0x73, 0x9c, 0x4a  // 32位目的IP地址
    	};
    
    
    	// 第1步:把IP数据包的校验和字段置为0;
    	//
    	ip_header[10] = 0x00;
    	ip_header[11] = 0x00;
    
    	// 第2、3步计算校验和
    	//
    	unsigned short checksum = GetChecksum((unsigned short*)ip_header, sizeof(ip_header));
    
    	printf("%02hhx %02hhx\n", *(char*)(&checksum), *((char*)(&checksum) + 1));
    
    	// 第4步:将第2、3步得到的2个字节数据存入首部校验和
    	//
    	ip_header[10] = *(char*)(&checksum);
    	ip_header[11] = *((char*)(&checksum) + 1);
    
    
    	// 模拟接收到IP包之后,对IP首部的校验和进行校验
    	//
    	unsigned short checksum_check = GetChecksum((unsigned short*)ip_header, sizeof(ip_header));
    	
    	if (checksum_check == 0) {
    		printf("checksum check successful!\n");
    	}
    	else {
    		printf("checksum check failed!\n");
    	}
    
        return 0;
    }
    
    

    四、IP校验和的设计原理

    我们将IP首部进行简化来讲解IP校验和的设计原理,假设IP首部只有6个字节,第5,6字节存放校验和:
    这里写图片描述

    计算校验和时第5,6字节置为0,校验和等于:A+B+0,然后取反,即:
    这里写图片描述

    接收端收到之后校验步骤为:求校验和(不同的是:校验和位不置0),若此时求得校验和为0,则校验通过。即:
    这里写图片描述

    《TCP/IP详解 卷1:协议》在线阅读地址:http://www.52im.net/topic-tcpipvol1.html

    展开全文
  • 太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    万次阅读 多人点赞 2020-05-25 11:34:46
    OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”。 二、 TCP/IP 基础 1. TCP/IP 的具体含义 从字面意义上讲,有人可能会认为...

     

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    一图看完本文

     

    一、 计算机网络体系结构分层

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    计算机网络体系结构分层

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    计算机网络体系结构分层

    不难看出,TCP/IP 与 OSI 在分层模块上稍有区别。OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”。

     

    二、 TCP/IP 基础

    1. TCP/IP 的具体含义

    从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分。TCP/IP 一词泛指这些协议,因此,有时也称 TCP/IP 为网际协议群。

    互联网进行通信时,需要相应的网络协议,TCP/IP 原本就是为使用互联网而开发制定的协议族。因此,互联网的协议就是 TCP/IP,TCP/IP 就是互联网的协议。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    网际协议群

    2. 数据包

    包、帧、数据包、段、消息

    以上五个术语都用来表述数据的单位,大致区分如下:

    • 包可以说是全能性术语;
    • 帧用于表示数据链路层中包的单位;
    • 数据包是 IP 和 UDP 等网络层以上的分层中包的单位;
    • 段则表示 TCP 数据流中的信息;
    • 消息是指应用协议中数据的单位。

    每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    数据包首部

    网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。包首部就像协议的脸。

    3. 数据处理流程

    下图以用户 a 向用户 b 发送邮件为例子:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    数据处理流程

    • ① 应用程序处理
    • 首先应用程序会进行编码处理,这些编码相当于 OSI 的表示层功能;
    • 编码转化后,邮件不一定马上被发送出去,这种何时建立通信连接何时发送数据的管理功能,相当于 OSI 的会话层功能。
    • ② TCP 模块的处理
    • TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要在应用层数据的前端附加一个 TCP 首部。
    • ③ IP 模块的处理
    • IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,参考路由控制表决定接受此 IP 包的路由或主机。
    • ④ 网络接口(以太网驱动)的处理
    • 从 IP 传过来的 IP 包对于以太网来说就是数据。给这些数据附加上以太网首部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。
    • ⑤ 网络接口(以太网驱动)的处理
    • 主机收到以太网包后,首先从以太网包首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。
    • 如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如 IP、ARP 等。这里的例子则是 IP 。
    • ⑥ IP 模块的处理
    • IP 模块接收到 数据后也做类似的处理。从包首部中判断此 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例子则是 TCP。
    • 另外吗,对于有路由器的情况,接收端地址往往不是自己的地址,此时,需要借助路由控制表,在调查应该送往的主机或路由器之后再进行转发数据。
    • ⑦ TCP 模块的处理
    • 在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。
    • ⑧ 应用程序的处理
    • 接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。

     

    三、传输层中的 TCP 和 UDP

    TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP。

    • TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP 为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。
    • UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。
    • TCP 和 UDP 的优缺点无法简单地、绝对地去做比较:TCP 用于在传输层有必要实现可靠传输的情况;而在一方面,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。TCP 和 UDP 应该根据应用的目的按需使用。

    1. 端口号

    数据链路和 IP 中的地址,分别指的是 MAC 地址和 IP 地址。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。

    1.1 根据端口号识别应用

    一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    通过端口号识别应用

    1.2 通过 IP 地址、端口号、协议号进行通信识别

    • 仅凭目标端口号识别某一个通信是远远不够的。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    通过端口号、IP地址、协议号进行通信识别

    • ① 和② 的通信是在两台计算机上进行的。它们的目标端口号相同,都是80。这里可以根据源端口号加以区分。
    • ③ 和 ① 的目标端口号和源端口号完全相同,但它们各自的源 IP 地址不同。
    • 此外,当 IP 地址和端口号全都一样时,我们还可以通过协议号来区分(TCP 和 UDP)。

    1.3 端口号的确定

    • 标准既定的端口号:这种方法也叫静态方法。它是指每个应用程序都有其指定的端口号。但并不是说可以随意使用任何一个端口号。例如 HTTP、FTP、TELNET 等广为使用的应用协议中所使用的端口号就是固定的。这些端口号被称为知名端口号,分布在 0~1023 之间;除知名端口号之外,还有一些端口号被正式注册,它们分布在 1024~49151 之间,不过这些端口号可用于任何通信用途。
    • 时序分配法:服务器有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。在这种方法下,客户端应用程序完全可以不用自己设置端口号,而全权交给操作系统进行分配。动态分配的端口号范围在 49152~65535 之间。

    1.4 端口号与协议

    • 端口号由其使用的传输层协议决定。因此,不同的传输层协议可以使用相同的端口号。
    • 此外,那些知名端口号与传输层协议并无关系。只要端口一致都将分配同一种应用程序进行处理。

    2. UDP

    • UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。
    • 并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况,UDP 也无法进行流量控制等避免网络拥塞行为。
    • 此外,传输途中出现丢包,UDP 也不负责重发。
    • 甚至当包的到达顺序出现乱序时也没有纠正的功能。
    • 如果需要以上的细节控制,不得不交由采用 UDP 的应用程序去处理。
    • UDP 常用于一下几个方面:1.包总量较少的通信(DNS、SNMP等);2.视频、音频等多媒体通信(即时通信);3.限定于 LAN 等特定网络中的应用通信;4.广播通信(广播、多播)。

    3. TCP

    • TCP 与 UDP 的区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在 UDP 中都没有。
    • 此外,TCP 作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。
    • 根据 TCP 的这些机制,在 IP 这种无连接的网络上也能够实现高可靠性的通信( 主要通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现)。

    3.1 三次握手(重点)

    • TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。
    • 所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。

    下面来看看三次握手的流程图:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    三次握手

    • 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
    • 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
    • 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

    3.2 四次挥手(重点)

    • 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
    • 由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

    下面来看看四次挥手的流程图:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    四次挥手

    • 中断连接端可以是客户端,也可以是服务器端。
    • 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
    • 第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
    • 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
    • 第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。

    上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,

    具体流程如下图:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    同时挥手

    3.3 通过序列号与确认应答提高可靠性

    • 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大
    • 在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。
    • 未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端误以为数据没有到达目的地而重发数据。
    • 此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。此时,源主机只要按照机制重发数据即可。
    • 对于目标主机来说,反复收到相同的数据是不可取的。为了对上层应用提供可靠的传输,目标主机必须放弃重复的数据包。为此我们引入了序列号。
    • 序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。通过序列号和确认应答号,TCP 能够识别是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    序列号和确认应答

    3.4 重发超时的确定

    • 重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过这个时间仍未收到确认应答,发送端将进行数据重发。最理想的是,找到一个最小时间,它能保证“确认应答一定能在这个时间内返回”。
    • TCP 要求不论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况发生何种变化,都必须保持这一特性。为此,它在每次发包时都会计算往返时间及其偏差。将这个往返时间和偏差时间相加,重发超时的时间就是比这个总和要稍大一点的值。
    • 在 BSD 的 Unix 以及 Windows 系统中,超时都以0.5秒为单位进行控制,因此重发超时都是0.5秒的整数倍。不过,最初其重发超时的默认值一般设置为6秒左右。
    • 数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以2倍、4倍的指数函数延长。
    • 此外,数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。

    3.5 以段为单位发送数据

    • 在建立 TCP 连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”(MSS)。最理想的情况是,最大消息长度正好是 IP 中不会被分片处理的最大数据长度。
    • TCP 在传送大量数据时,是以 MSS 的大小将数据进行分割发送。进行重发时也是以 MSS 为单位。
    • MSS 在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在 TCP 首部中写入 MSS 选项,告诉对方自己的接口能够适应的 MSS 的大小。然后会在两者之间选择一个较小的值投入使用。

    3.6 利用窗口控制提高速度

    • TCP 以1个段为单位,每发送一个段进行一次确认应答的处理。这样的传输方式有一个缺点,就是包的往返时间越长通信性能就越低。
    • 为解决这个问题,TCP 引入了窗口这个概念。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。如下图所示:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    •  
    • 窗口控制
    • 窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。上图中窗口大小为4个段。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。

    3.7 滑动窗口控制

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    滑动窗口

    • 上图中的窗口内的数据即便没有收到确认应答也可以被发送出去。不过,在整个窗口的确认应答没有到达之前,如果其中部分数据出现丢包,那么发送端仍然要负责重传。为此,发送端主机需要设置缓存保留这些待被重传的数据,直到收到他们的确认应答。
    • 在滑动窗口以外的部分包括未发送的数据以及已经确认对端已收到的数据。当数据发出后若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。
    • 收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序地将多个段同时发送提高通信性能。这种机制也别称为滑动窗口控制。

    3.8 窗口控制中的重发控制

    在使用窗口控制中, 出现丢包一般分为两种情况:

    • ① 确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的,如下图:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    部分确认应答丢失

    • ② 某个报文段丢失的情况。接收主机如果收到一个自己应该接收的序列号以外的数据时,会针对当前为止收到数据返回确认应答。如下图所示,当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,因此,在窗口比较大,又出现报文段丢失的情况下,同一个序列号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答,就会将其对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称为高速重发控制。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    高速重发控制

     

    四、网络层中的 IP 协议

    • IP(IPv4、IPv6)相当于 OSI 参考模型中的第3层——网络层。网络层的主要作用是“实现终端节点之间的通信”。这种终端节点之间的通信也叫“点对点通信”。
    • 网络的下一层——数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。
    • IP 大致分为三大作用模块,它们是 IP 寻址、路由(最终节点为止的转发)以及 IP 分包与组包。

    1. IP 地址

    1.1 IP 地址概述

    • 在计算机通信中,为了识别通信对端,必须要有一个类似于地址的识别码进行标识。在数据链路中的 MAC 地址正是用来标识同一个链路中不同计算机的一种识别码。
    • 作为网络层的 IP ,也有这种地址信息,一般叫做 IP 地址。IP 地址用于在“连接到网络中的所有主机中识别出进行通信的目标地址”。因此,在 TCP/IP 通信中所有主机或路由器必须设定自己的 IP 地址。
    • 不论一台主机与哪种数据链路连接,其 IP 地址的形式都保持不变。
    • IP 地址(IPv4 地址)由32位正整数来表示。IP 地址在计算机内部以二进制方式被处理。然而,由于我们并不习惯于采用二进制方式,我们将32位的 IP 地址以每8位为一组,分成4组,每组以 “.” 隔开,再将每组数转换成十进制数。如下:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    1.2 IP 地址由网络和主机两部分标识组成

    • 如下图,网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP 地址的“主机标识”则不允许在同一个网段内重复出现。由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的 IP 地址都不会相互重叠。即 IP 地址具有了唯一性。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    IP地址的主机标识

    • 如下图,IP 包被转发到途中某个路由器时,正是利用目标 IP 地址的网络标识进行路由。因为即使不看主机标识,只要一见到网络标识就能判断出是否为该网段内的主机。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    IP地址的网络标识

    1.3 IP 地址的分类

    • IP 地址分为四个级别,分别为A类、B类、C类、D类。它根据 IP 地址中从第 1 位到第 4 位的比特列对其网络标识和主机标识进行区分。
    • A 类 IP 地址是首位以 “0” 开头的地址。从第 1 位到第 8 位是它的网络标识。用十进制表示的话,0.0.0.0~127.0.0.0 是 A 类的网络地址。A 类地址的后 24 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为16,777,214个。
    • B 类 IP 地址是前两位 “10” 的地址。从第 1 位到第 16 位是它的网络标识。用十进制表示的话,128.0.0.0~191.255.0.0 是 B 类的网络地址。B 类地址的后 16 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为65,534个。
    • C 类 IP 地址是前三位为 “110” 的地址。从第 1 位到第 24 位是它的网络标识。用十进制表示的话,192.0.0.0~223.255.255.0 是 C 类的网络地址。C 类地址的后 8 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为254个。
    • D 类 IP 地址是前四位为 “1110” 的地址。从第 1 位到第 32 位是它的网络标识。用十进制表示的话,224.0.0.0~239.255.255.255 是 D 类的网络地址。D 类地址没有主机标识,常用于多播。
    • 在分配 IP 地址时关于主机标识有一点需要注意。即要用比特位表示主机地址时,不可以全部为 0 或全部为 1。因为全部为 0 只有在表示对应的网络地址或 IP 地址不可以获知的情况下才使用。而全部为 1 的主机通常作为广播地址。因此,在分配过程中,应该去掉这两种情况。这也是为什么 C 类地址每个网段最多只能有 254( 28 - 2 = 254)个主机地址的原因。

    1.4 广播地址

    • 广播地址用于在同一个链路中相互连接的主机之间发送数据包。将 IP 地址中的主机地址部分全部设置为 1,就成了广播地址。
    • 广播分为本地广播和直接广播两种。在本网络内的广播叫做本地广播;在不同网络之间的广播叫做直接广播。

    1.5 IP 多播

    • 多播用于将包发送给特定组内的所有主机。由于其直接使用 IP 地址,因此也不存在可靠传输。
    • 相比于广播,多播既可以穿透路由器,又可以实现只给那些必要的组发送数据包。请看下图:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    •  
    • IP 多播
    • 多播使用 D 类地址。因此,如果从首位开始到第 4 位是 “1110”,就可以认为是多播地址。而剩下的 28 位可以成为多播的组编号。
    • 此外, 对于多播,所有的主机(路由器以外的主机和终端主机)必须属于 224.0.0.1 的组,所有的路由器必须属于 224.0.0.2 的组。

    1.6 子网掩码

    • 现在一个 IP 地址的网络标识和主机标识已不再受限于该地址的类别,而是由一个叫做“子网掩码”的识别码通过子网网络地址细分出比 A 类、B 类、C 类更小粒度的网络。这种方式实际上就是将原来 A 类、B 类、C 类等分类中的主机地址部分用作子网地址,可以将原网络分为多个物理网络的一种机制。
    • 子网掩码用二进制方式表示的话,也是一个 32 位的数字。它对应 IP 地址网络标识部分的位全部为 “1”,对应 IP 地址主机标识的部分则全部为 “0”。由此,一个 IP 地址可以不再受限于自己的类别,而是可以用这样的子网掩码自由地定位自己的网络标识长度。当然,子网掩码必须是 IP 地址的首位开始连续的 “1”。
    • 对于子网掩码,目前有两种表示方式。第一种是,将 IP 地址与子网掩码的地址分别用两行来表示。以 172.20.100.52 的前 26 位是网络地址的情况为例,如下:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    • 第二种表示方式是,在每个 IP 地址后面追加网络地址的位数用 “/ ” 隔开,如下:

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    2. 路由

    • 发送数据包时所使用的地址是网络层的地址,即 IP 地址。然而仅仅有 IP 地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。保存这种信息的就是路由控制表。
    • 该路由控制表的形成方式有两种:一种是管理员手动设置,另一种是路由器与其他路由器相互交换信息时自动刷新。前者也叫做静态路由控制,而后者叫做动态路由控制。
    • IP 协议始终认为路由表是正确的。然后,IP 本身并没有定义制作路由控制表的协议。即 IP 没有制作路由控制表的机制。该表示由一个叫做“路由协议”的协议制作而成。

    2.1 IP 地址与路由控制

    • IP 地址的网络地址部分用于进行路由控制。
    • 路由控制表中记录着网络地址与下一步应该发送至路由器的地址。
    • 在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

    路由控制表与 IP 包发送

    3. IP 分包与组包

    • 每种数据链路的最大传输单元(MTU)都不尽相同,因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的 MTU 也就不同。
    • 任何一台主机都有必要对 IP 分片进行相应的处理。分片往往在网络上遇到比较大的报文无法一下子发送出去时才会进行处理。
    • 经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。

    3.1 路径 MTU 发现

    • 分片机制也有它的不足。如路由器的处理负荷加重之类。因此,只要允许,是不希望由路由器进行 IP 数据包的分片处理的。
    • 为了应对分片机制的不足,“路径 MTU 发现” 技术应运而生。路径 MTU 指的是,从发送端主机到接收端主机之间不需要分片是最大 MTU 的大小。即路径中存在的所有数据链路中最小的 MTU 。
    • 进行路径 MTU 发现,就可以避免在中途的路由器上进行分片处理,也可以在 TCP 中发送更大的包。

    4. IPv6

    • IPv6(IP version 6)是为了根本解决 IPv4 地址耗尽的问题而被标准化的网际协议。IPv4 的地址长度为 4 个 8 位字节,即 32 比特。而 IPv6 的地址长度则是原来的 4 倍,即 128 比特,一般写成 8 个 16 位字节。

    4.1 IPv6 的特点

    • IP 得知的扩大与路由控制表的聚合。
    • 性能提升。包首部长度采用固定的值(40字节),不再采用首部检验码。简化首部结构,减轻路由器负担。路由器不再做分片处理。
    • 支持即插即用功能。即使没有DHCP服务器也可以实现自动分配 IP 地址。
    • 采用认证与加密功能。应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能。
    • 多播、Mobile IP 成为扩展功能。

    4.2 IPv6 中 IP 地址的标记方法

    • 一般人们将 128 比特 IP 地址以每 16 比特为一组,每组用冒号(“:”)隔开进行标记。
    • 而且如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号(“::”)隔开。但是,一个 IP 地址中只允许出现一次两个连续的冒号。

    4.3 IPv6 地址的结构

    • IPv6 类似 IPv4,也是通过 IP 地址的前几位标识 IP 地址的种类。
    • 在互联网通信中,使用一种全局的单播地址。它是互联网中唯一的一个地址,不需要正式分配 IP 地址。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    4.4 全局单播地址

    • 全局单播地址是指世界上唯一的一个地址。它是互联网通信以及各个域内部通信中最为常用的一个 IPv6 地址。
    • 格式如下图所示,现在 IPv6 的网络中所使用的格式为,n = 48,m = 16 以及 128 - n - m = 64。即前 64 比特为网络标识,后 64 比特为主机标识。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    全局单播地址

    4.5 链路本地单播地址

    • 链路本地单播地址是指在同一个数据链路内唯一的地址。它用于不经过路由器,在同一个链路中的通信。通常接口 ID 保存 64 比特版的 MAC 地址。

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    链路本地单播地址

    4.6 唯一本地地址

    • 唯一本地地址是不进行互联网通信时所用的地址。
    • 唯一本地地址虽然不会与互联网连接,但是也会尽可能地随机生成一个唯一的全局 ID。
    • L 通常被置为 1
    • 全局 ID 的值随机决定
    • 子网 ID 是指该域子网地址
    • 接口 ID 即为接口的 ID

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    唯一本地地址

    4.7 IPv6 分段处理

    • IPv6 的分片处理只在作为起点的发送端主机上进行,路由器不参与分片。
    • IPv6 中最小 MTU 为 1280 字节,因此,在嵌入式系统中对于那些有一定系统资源限制的设备来说,不需要进行“路径 MTU 发现”,而是在发送 IP 包时直接以 1280 字节为单位分片送出。

    4.8 IP 首部(暂略)

    5. IP 协议相关技术

    • IP 旨在让最终目标主机收到数据包,但是在这一过程中仅仅有 IP 是无法实现通信的。必须还有能够解析主机名称和 MAC 地址的功能,以及数据包在发送过程中异常情况处理的功能。

    5.1 DNS

    • 我们平常在访问某个网站时不适用 IP 地址,而是用一串由罗马字和点号组成的字符串。而一般用户在使用 TCP/IP 进行通信时也不使用 IP 地址。能够这样做是因为有了 DNS (Domain Name System)功能的支持。DNS 可以将那串字符串自动转换为具体的 IP 地址。
    • 这种 DNS 不仅适用于 IPv4,还适用于 IPv6。

    5.2 ARP

    • 只要确定了 IP 地址,就可以向这个目标地址发送 IP 数据报。然而,在底层数据链路层,进行实际通信时却有必要了解每个 IP 地址所对应的 MAC 地址。
    • ARP 是一种解决地址问题的协议。以目标 IP 地址为线索,用来定位下一个应该接收数据分包的网络设备对应的 MAC 地址。不过 ARP 只适用于 IPv4,不能用于 IPv6。IPv6 中可以用 ICMPv6 替代 ARP 发送邻居探索消息。
    • RARP 是将 ARP 反过来,从 MAC 地址定位 IP 地址的一种协议。

    5.3 ICMP

    • ICMP 的主要功能包括,确认 IP 包是否成功送达目标地址,通知在发送过程当中 IP 包被废弃的具体原因,改善网络设置等。
    • IPv4 中 ICMP 仅作为一个辅助作用支持 IPv4。也就是说,在 IPv4 时期,即使没有 ICMP,仍然可以实现 IP 通信。然而,在 IPv6 中,ICMP 的作用被扩大,如果没有 ICMPv6,IPv6 就无法进行正常通信。

    5.4 DHCP

    • 如果逐一为每一台主机设置 IP 地址会是非常繁琐的事情。特别是在移动使用笔记本电脑、只能终端以及平板电脑等设备时,每移动到一个新的地方,都要重新设置 IP 地址。
    • 于是,为了实现自动设置 IP 地址、统一管理 IP 地址分配,就产生了 DHCP(Dynamic Host Configuration Protocol)协议。有了 DHCP,计算机只要连接到网络,就可以进行 TCP/IP 通信。也就是说,DHCP 让即插即用变得可能。
    • DHCP 不仅在 IPv4 中,在 IPv6 中也可以使用。

    5.5 NAT

    • NAT(Network Address Translator)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。
    • 除转换 IP 地址外,还出现了可以转换 TCP、UDP 端口号的 NAPT(Network Address Ports Translator)技术,由此可以实现用一个全局 IP 地址与多个主机的通信。
    • NAT(NAPT)实际上是为正在面临地址枯竭的 IPv4 而开发的技术。不过,在 IPv6 中为了提高网络安全也在使用 NAT,在 IPv4 和 IPv6 之间的相互通信当中常常使用 NAT-PT。

    5.6 IP 隧道

    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了

     

    夹着 IPv4 网络的两个 IPv6 网络

    • 如上图的网络环境中,网络 A 与网络 B 之间无法直接进行通信,为了让它们之间正常通信,这时必须得采用 IP 隧道的功能。
    • IP 隧道可以将那些从网络 A 发过来的 IPv6 的包统合为一个数据,再为之追加一个 IPv4 的首部以后转发给网络 C。
    • 一般情况下,紧接着 IP 首部的是 TCP 或 UDP 的首部。然而,现在的应用当中“ IP 首部的后面还是 IP 首部”或者“ IP 首部的后面是 IPv6 的首部”等情况与日俱增。这种在网络层的首部后面追加网络层首部的通信方法就叫做“ IP 隧道”。

     

    作者:涤生_Woo

    链接:https://www.jianshu.com/p/9f3e879a4c9c

     

    展开全文
  • IP协议详解(一)

    万次阅读 2018-10-02 12:31:41
    深入剖析IP协议,大部分时间就是深入剖析IP头部协议,随着现在的IPv6马上的普及,我们今天就来详细分析一下IPv4和IPv6的头部。 IPv4 1.版本号:占四位,就是IP协议的版本,通信双方的IP协议必须要达到一致,IPv4...
  • 内网ip和外网ip区别

    万次阅读 多人点赞 2019-04-09 15:22:40
    文章一: ... 我们每天都会访问各种各样...要想搞清楚这个问题,首先就得先搞清楚内网ip和外网ip的联系。 如图,假设我们的计算机现在就是设备一,我们想要访问百度。如果我们正使用着校园网,那么首先我们需要先通...
  • TCP/IP协议组——完整工作过程分析

    万次阅读 多人点赞 2019-02-15 20:53:44
    1.什么是TCP/IP TCP/IP是一套用于网络通信的协议集合或者系统。TCP/IP协议模型就有OSI模型分为7层。但其实一般我们所谈到的都是四层的TCP/IP协议栈。 网络接口层:主要是指一些物理层层次的接口,比如电缆等 ...
  • 彻底明白ip地址,区分localhost、127.0.0.1和0.0.0.0

    万次阅读 多人点赞 2018-12-04 15:37:29
    通俗的理解ip是什么 对于ip,大家并不陌生,在网络访问中,我们会经常使用到,那么ip是什么呢?其实如同我们的身份证一般,ip就是我们在网络中的身份证,具有唯一性,用于标识我们的身份。我们平时使用http协议对...
  • 【TCP/IPIP地址分类和特殊IP地址

    万次阅读 多人点赞 2019-02-05 17:36:02
    IP地址是因特网技术中的一个非常重要的概念,IP地址在IP层实现了底层网络地址的统一,使因特网的网络层地址具有全局唯一性和一致性。IP地址含有位置信息,反映了主机的网络连接,使因特网进行寻址和路由选择的依据。...
  • IP协议协议--IP头部信息

    万次阅读 2017-11-20 08:39:06
    IP协议概述  IP协议是TCP/IP协议簇的核心,它为上层(传输层)协议(TCP/UDP)提供无状态、无连接、不可靠的服务。  (1) 无状态: IP通信双方的数据状态信息不同步,即所有的IP数据报的发送、传输、接收都是相互独立...
  • 将研发环境部署在阿里云,无疑是这一年做得最正确的决定。 在云端无论你在哪里,只要启用终端就可以直接进入工作状态。 我一直苦恼笔记本电池的续航能力,想不到 ipad(mini2) + termius +100 块的蓝牙键盘就可以...
  • 配置PC端ssh服务器 找到应用和功能系统设置 进入可选功能选择添加功能中选择openSSH ...因为我已经安装好了,所以直接就在可选功能中啦 3. 在命令行中设置开机自启动和启动ssh服务器 ...因为我们的目的是在ipad上...
  • WDCP 打开网站 提示:ERR_EMPTY_RESPONSE,服务器未发送任何数据,因此无法加载该网页原因:解决方法:注意事项: 原因: 没有在服务器的 域名管理 里面添加该域名 解决方法: 在该服务器里找到 域名管理 添加该域名 ...
  • 一、下载驱动 网卡采用USB 2.0转以太网控制芯片AX88772B, Android 2.3 和4.0下的通用网卡驱动不支持这款芯片, 需要从网上下载最新的Linux 下AX88772B驱动 驱动下载地址:...二、将下载的驱动源码编译
  • 初学k8s,对集群里面的IP真的不是很理解,一会是PodIP,一会是ClusterIP,总结一下这些IP。 Kubernetes集群里有三种IP地址,分别如下: Node IP:Node节点的IP地址,即物理网卡的IP地址。 Pod IP:Pod的IP地址,即...
  • Linux 如何快速查看 IP 地址

    万次阅读 2018-01-24 16:57:03
    查看IP: 1.进入Linux 系统,在主页面空旷的地方右键,选择 打开终端。 2. 在显示的界面中输入 ifconfig -a 就可以查看到Linux 的地址了。 快速查看IP 和修改: 1.点击应用程序 ->选择系统工具-》选择设置 ->...
  • centos系统查看本机IP地址

    万次阅读 2017-03-13 09:52:46
    centos系统查看本机IP地址,输入 ifconfig -a查看
  • Mac查看本机IP的终端命令

    万次阅读 2018-06-21 11:14:00
    在Mac系统中,打开终端,输入命令ifconfig并按回车即可查看本机IP,如图:输入命令ifconfig en0也可以查看本机IP(最后是数字0,而不是字母O),如图:
  • 查看虚拟机里的Centos7的IP

    万次阅读 多人点赞 2017-06-22 22:57:38
    这里之所以是查看下IP ,是我们后面要建一个Centos远程工具Xshell 连接Centos的时候,需要IP地址,所以我们这里先 学会查看虚拟机里的Centos7的IP地址 首先我们登录操作系统 用户名root 密码 123456 然后我们...
  • linux获取/查看本机出口ip

    万次阅读 2013-11-07 11:38:23
    获取/查看本机出口ip curl http://members.3322.org/dyndns/getip  1 curl ifconfig.me 2 #或者 3 curl ...
1 2 3 4 5 ... 20
收藏数 2,461,900
精华内容 984,760
关键字:

ip