• 《TCP/IP详解 卷1:协议》读书笔记


    第一章 概述

    协议栈

    应用层 HTTP,FTP  
    运输层 TCP, UDP 段(Segment)
    网络层 IP, ICMP, IGMP 数据报(Datagram)
    链路层   帧(Frame)
    物理层    

    应用层关心的是应用程序的细节,而不是数据在网络中的传输活动;下面四层对应用程序一无所知,但它们要处理所有的通信细节。

     

    互联网地址

     

    端口号

    周知端口号(Well-Known Ports) 1-255
    Unix系统占用端口 256-1023
    临时可分配端口 1024-5000
    为其他服务预留端口 5001-

    大多数TCP/IP分配的端口在1024-5000之间。

    第二章 链路层

    环回接口

    环回接口:127.0.0.1 or localhost,可简单理解为本机的ip地址。

    注:IP输出函数的入口是和IP输入函数的出口都是网络层,下图是链路层的环回接口如何处理来自网络层的IP数据报。

    注意点1:传给环回接口(127.0.0.1)的任何数据均作为IP输入(即从链路层传给网络层)

    注意点2:传给广播和多播的数据复制一份传给环回接口(即广播和多播地址包含主机本身)

    注意点3:任何传给该主机IP地址的数据均送到环回接口(比如该主机IP为172.18.156.139,则从网络层传到链路层的以该IP为目的地址的数据报,均送到环回接口再返回给网络层,所以一个传给环回接口的IP数据报不能在任何网络上出现)

     

    最大传输单元MTU

    最大传输单元MTU表示链路层数据帧所能传输的最大字节数。

    如果IP数据报的长度比链路层的MTU还大,那么IP层就需要分片。

    路径MTU:两台主机路径中的最小的MTU。

    第三章 IP :网际协议

    IP协议提供不可靠,无连接的数据报传送服务。
    不可靠:不保证IP数据报成功到达目的地。
    无连接:IP不维护后续数据报的状态信息(不一定按序发送和接收)。

    IP首部

     

    IP首部一般为20个字节,除非包含选项字段。

    版本:IPv4或IPv6

    首部长度首部的长度,以4 byte为单位,包含选项字段。该字段共4 bit,因此IP首部最长为60 Byte,且必须为4 Byte的倍数

    服务类型

    总长度:整个IP数据报的长度,以byte为单位。该字段共16 bit,所以IP数据报最长为2^16 byte

    标识:唯一标识主机发送的每一份数据报

    TTL:Time-To-Live,数据报可以经过的最多路由数

    协议:识别是哪个协议向IP协议传送数据,包括TCP,UDP,ICMP,IGMP……

    首部检验和:根据IP首部计算的检验和码(将该字段置0,对首部中每16bit进行二进制反码求和,结果存在该字段;接收方收到后对首部中没16bit进行二进制反码求和,若结果全为全1,则正确)(注意是对IP首部进行检验,而不是IP首部+IP数据,而UDP的检验和是针对UDP首部+UDP数据)(但是为什么要反码?)

    IP地址:32bit,记录格式一般为点分十进制(e.g. 192.168.1.1)

    为什么要用反码求和而不是原码求和来检验首部和?

    1)首先,我们要明确反码求和和原码求和的区别,反码求和溢出时,即最高位有进位,则将该进位加到最低位上;而原码求和则是丢弃该进位。

    2)其次,明确Big Endian字节序和Little Endian字节序:

    TCP/IP网络传输时,先传0-7bit,其次8-15bit,然后16-23bit,最后24-31bit(从小到大),这叫网络字节序,也叫Big Endian字节序。

    Big Endian字节序:最高字节在地址最低位,最低字节在地址最高位

    Little Endian字节序:反之

    比如将 0x1234 存入 0x0000 开始的内存

    Memery     Big Endian    Little Endian

    0x0000     0x12            0x34

    0x0001     0x34            0x12

    3)那么,使用反码求和就可以不依赖系统是Big Endian字节序还是Little Endian字节序,而原码求和会受到字节序的影响。

    4)最后,举个例子就明白了。

    原码:

      10000000 00000000

    +10000010 00000000

    =00000010 00000000

    原码,使用另一种字节序:

      00000000 10000000

    +00000000 10000010

    =00000001 00000010

    反码:

      01111111 11111111

    +01111101 11111111

    =11111101 11111111

    反码,使用另一种字节序:

      11111111 01111111

    +11111111 01111101

    =11111111 11111101

    可以看到,反码求和,改变了字节序,结果相同,只是字节顺序相应地也交换了;而原码的结果就不同了。

    IP路由选择

    IP从TCP,UDP,ICMP和IGMP接收数据报(即本地生成的数据)并进行发送,或者从一个网络接口接收数据进行转发或接收。

    1)当数据来自TCP,UDP,ICMP和IGMP(从上传递下来的):

    传递给链路层

    2)当数据报来自网络接口(从下传递上来的):

    (1)IP首先判断IP地址是否为本地地址或者广播地址,如果是就送到首部协议段所指定的协议模块进行处理(继续向上传递)

    (2)如果不满足这些地址,且IP层设置为了路由功能,那么就对数据报进行转发,否则数据报被丢弃

    那么,什么叫IP的路由功能呢?有了路由功能怎么对数据报进行转发呢?

    当收到一个IP数据报的时候,IP并不知道该数据报达到最终目的的完整路径,所有的IP路由选择只为数据报提供下一站路由器的IP地址,IP的路由选择功能为:

    1)搜索路由表,寻找目的IP地址(网络号+主机号),找到则发给该行记录的下一个路由器

    2)若1)失败,则继续搜索路由表,寻找目的IP地址的所在网络号,找到则发给该行记录的下一个路由器

    3)若2)失败,则继续搜索路由表,寻找叫做“默认”的那行记录,找到则发给该行记录的下一个路由器

    4)若3)失败,则该数据报就不能被传送

    子网掩码

    IP地址=网络号+子网号+主机号

    子网掩码即与IP地址对应的网络号和子网号为1,主机号为0的32个bit

    子网的划分缩减了路由表的规模:

    为了到达IP地址为140.252.*.*的主机,路由表现在只需记录到达子网络140.252的下一跳,而不需要记录该子网下的所有主机的下一跳。

    第四章 ARP:地址解析协议

    链路层的以太网地址是48位(如:‎20-6A-8A-4B-E9-2F),而网络层的IP地址是32位(如:172.18.156.36)。

    ARP和RARP就是为IP地址与硬件地址之间提供动态转换

    当用户输入ftp://www.abc.com(或http://www.baidu.com)的时候,发生的事情如下:

    • 应用层:利用DNS将主机名转换为IP地址
    • 运输层:运输层得到从应用层传下来的IP地址,准备利用得到的IP地址建立TCP连接
    • 网络层:网络层得到从运输层传下来的TCP段,封装为IP数据报(该数据报用于建立TCP连接)
    • 链路层:链路层得到从网络层传下来的IP数据报,在该以太网内进行广播,询问每一台主机哪个包含该IP地址,接着某主机对该广播应答,然后链路层就知道将该帧发到哪台主机去才能正确达到目的地。

    第五章 RARP:逆地址解析协议

    具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址。但无盘机则需要利用RARP来获得它自己的IP地址。

    无盘机可以读取自己的硬件地址,然后广播一份RARP请求(含其硬件地址)给该网内的其他主机,请求某个主机响应该无盘系统的IP地址(在RARP应答中)。

    第六章 ICMP:Internet控制报文协议

     ICMP时间戳请求与应答

    ICMP时间戳请求允许系统向另一个系统查询当前的时间。

    请求端填写发起时间戳,然后发送请求报文,应答端收到报文的同时填写接收时间戳和传送时间戳,然后发送应答报文。

    其中发起时间戳是指请求端的发送时间,而传送时间戳是指应答端的发送时间。一般设接收时间戳和传送时间戳为相同的值。

    假如请求端收到的应答报文如下:

    其中,发起时间比接收时间早6ms,而rtt=2ms,所以请求端的时间比应答端的时间早7ms。

    为什么,见下图自己理解。

    第七章 Ping程序

     Ping程序发送ICMP回显报文给目标主机,并等待返回ICMP回显应答。

    Ping程序发送的是ICMP报文,是对两个TCP/IP系统连通性进行测试的基本工具。

    第八章 Traceroute程序

    Traceroute程序可以让我们看到IP数据报从本主机到另一台主机所经过的路由的地址。

    Traceroute程序使用ICMP报文和IP数据报中的TTL字段来实现:

    (1)发送端发送一个TTL为1的UDP数据报,收到该数据报的路由器将TTL减一,发现TTL为0,于是丢弃该数据报并发回一份ICMP超时报文;

    (2)发送端接收到ICMP超时报文的时候就可以提取里面的IP地址,由此得知第一跳的IP,然后发送一个TTL为2的UDP数据报,接受到的路由器将TTL减一,如果TTL不为0则继续转发,如果为0则丢弃该数据报并发回一份ICMP超时报文;

    (3)以此类推,直到目的主机接收到该UDP数据报,发现自己是目的主机,则丢弃该数据报并发回一份ICMP端口不可达的报文。

    (4)发送端根据收到的是ICMP超时报文还是ICMP端口不可达报文来确定是否成功达到目的主机。

    第九章 IP选路

    路由表标志

    U 该路由可用

    G 该路由是一个网关,如果没有此标志,说明下一跳就是目的地

    H 该路由的目的地址为主机地址,无此标志表示目的地址为网络地址(网络地址的主机号全为0)

    D 该路由由重定向报文创建

    M 该路由被重定向报文修改

    • G区别了间接路由和直接路由,有G即为间接路由
      • 发往直接路由的分组包含目的地址的IP和链路层地址
      • 发往间接路由的分组包含目的地址的IP,链路层地址为间接路由的地址(即目的IP地址是一致的,但链路层地址永远为下一跳的地址)
    • H标志区别了主机地址和网络地址,有H即为主机地址(Host)
      • 下一跳的地址是一个主机地址,一个IP地址过来,查找路由表的时候,该IP地址必须跟该行的目的IP地址完全匹配才是对的
      • 下一跳的地址是一个网络地址,一个IP地址过来,查找路由表的时候,只要该IP地址的网络部分与该行的目的IP地址的网络部分匹配即可,不必管主机部分(注意:路由表的每一行都隐藏了目的IP地址的子网掩码,所以它可以确定目的IP地址的网络部分)

    IP路由选择例子(详见第三章)

    如上图,假如目的地址是140.252.13.33。

    查找路由表,发现第一第二行是主机地址,均不完全匹配;第三行是default,暂时跳过;第四行的网络部分与该IP地址的网络部分相同,所以使用第四行的数据,将IP数据报经接口emd0发给140.252.13.34。

    疑问:虽然方法正确,但是IP数据报并没有发送给正确的目的地(140.252.13.33),这只是路由表的问题吗?

    不知何去何从的IP数据报

    假如路由表中没有找到合适的行(路由表中也没有default项),那么路由会如何处理呢?当然是丢弃该IP数据报,然后……

    (1)如果该IP数据报是本机产生的,那么就给发送该数据报的应用程序返回一个差错

    (2)如果该IP数据报不是本机产生的,那么就给原始发送端发送一份ICMP主机不可达的差错报文

    ICMP重定向报文

    ICMP重定向报文是ICMP控制报文中的一种。

    在特定的情况下,当路由器检测到一台主机使用非优化路由的时候,它会向主机发送一个ICMP重定向报文,请求主机改变路由表。

    同时,负责任的路由器也会把初始数据报向它的目的地转发。

    什么情况下路由器会发送ICMP重定向报文呢?

    如图,当路由器发现源IP地址与下一跳属于同一网段时。

    第十章 动态选路协议

    选路协议的分类

    静态选路:配置接口时,以默认方式生成路由表项(路由表项就是表的每一行数据)或使用route命令来手工添加表项,或通过ICMP重定向生成表项

    动态选路:

    • 内部网关协议IGP(Interior Gateway Protocol)
      • 选路信息协议RIP(Routing Information Protocol)
      • 开放最短路径优先OSPF(Open Shortest Path First)
    • 外部网关协议EGP(Exterier Gateway Protocol)
      • 边界网关协议BGP(Border Gateway Protocol)

    动态选路的工作原理

    路由表中有一个常驻内存的程序,叫路由守护程序(routing daemon)。该程序与其相邻的路由表进行通信,根据得到的信息更新路由表。

    RIP(Routing Information Protocol)选路信息协议

    工作过程

    (1)初始化

      在启动一个路由守护程序时,它先判断启动了哪些接口,并在每个接口上发送一个请求报文,要求其他路由器发送完整路由表

    • 在点对点链路中,该请求是发送给其他终点的
    • 如果网络支持广播的话,这种请求是以广播形式发送的

    (2)接收到请求

    • 如果这个请求是特殊请求(报文中设置了某字段),那么路由器就将完整的路由表发送给请求者
    • 否则,就处理请求中的每一个表项,如果有连接到指明地址的路由,则将与其的距离设置成请求中的值,否则置为16(16表示"无穷大"),然后发回响应

      例如,有4个路由ABCD,B和AC相连,不与D相连。某时,A通知B,C和D与B的距离为1。B收到后,更新了与C的距离为1,但是它与D不相连,于是更新了与D的距离为16

    (3)接收到响应

      更新路由表

    (4)定期选路更新。每过30秒,所有或部分路由器会将其完整路由表发送给相邻路由器

    (5)触发更新

      每当一条路由的距离发生变化时,就对它进行更新。不需要发送完整路由表,而只需要发送那些发生变化的表项。每条路由都有与之相关的定时器。如果发现一条路由在3分钟内未更新,就将该路由的距离设置成无穷大(16),并标注为删除。这意味着已经在6个30秒更新时间里没收到通告该路由的路由器的更新了。再过60秒,将从本地路由表中删除该路由,以保证该路由的失效已被传播开

    OSPF(Open Shortest Path First)开放最短路径优先

    RIP采用距离向量,而OSPF采用链路状态信息来更新路由表(RIP中,路由表交换的信息是路由与路由的距离)。

    OSPF比RIP收敛快(一旦有路由器崩溃,RIP中消息传得太慢),因此规模较小的网络可以采用RIP,规模较大应采用OSPF。

    OSPF通过路由器之间通告网络接口的状态来建立链路状态数据库,生成最短路径树,每个OSPF路由器使用这些最短路径构造路由表。

    例如,A连B和D,B连C和D。开始,AB通信,B告诉A,BC=1,BD=1。那么A就可以计算得出,AB=1,AC=2,AD=2。然后AD通信,D告诉A,BD=1。然后A权衡,发现通过D到B则AB=2,通过B到B则AB=1,则取AB=1;其次,通过B到D,AD=2,通过D到D,AD=1,则取AD=1。最终A的路由表为,AB=1,AD=1,AC=2。

    通过这里例子可以可以看到,RIP只保存到达目标地址的下一跳路由的信息;而OSPF保存了局域网内所有路由的信息。

    第十四章 DNS:域名系统

    含义:Domain Name System,域名系统

    功能:提供域名和IP地址相互映射

    为什么需要DNS?

    为了避免记住纯数字组成的IP地址,人们发明了域名。为此,域名与IP地址之间要有映射关系。

    刚开始,每台主机有一个HOSTS文件(位置:C:WindowsSystem32driversetchosts),里面存放着世界上所有域名和IP的映射关系,这样域名解析的任务每台计算机都可以独立完成。但是这样HOSTS文件过于分散,不易统一管理;而且IP越来越多,这个文件越来越大。

    那么最简单的,如果世界上有一台服务器,存储着世界上所有域名和IP的映射关系,即整个世界只有一份HOSTS文件,那么确实易于管理,所有计算机上网的时候就可以去访问它得到正确的IP,但是这样这台服务器会不堪重负。

    所以,DNS应运而生。DNS采用的是分布式的解析方案。见下图。

    至今为止,这个世界上有13台根服务器。根服务器的任务就是将域名解析的任务分配给顶级域的服务器。顶级域的服务器也可以像根服务器那样将解析权分配给下属服务器。

    例如根服务器会将所有com域名的解析任务全部交给负责com的服务器,负责com的服务器会将所有cnblogs.com域名的解析任务全部交给负责cnblogs.com的服务器。

    常见的顶级域名有:

    com 商业组织
    edu 教育机构
    gov 美国政府部门
    net 网络
    org 其他组织

    DNS是怎么工作的

    推荐阅读:浅谈DNS体系结构:DNS系列之一

    我们在浏览器上输入i.cnblogs.com之后,我们这台主机会向DNS服务器发送一条DNS查询报文以查询该域名对应的IP。

    (注意,该报文是UDP报文,不需要与DNS服务器建立TCP连接;我们这台主机本来就知道DNS服务器的IP地址,要么是写好的静态IP,要么是路由器动态分配的IP,不是域名,所以DNS查询这个过程也不需要去解析域名,否则无限循环了……)

    DNS服务器若有关该域名的记录,则发送IP回我们的主机,结束。

    DNS服务器若不知道,则它向根服务器发送关于该域名的请求。

    (注意,每台DNS服务器都必须知道根服务器的IP,这是作为一台DNS服务器的素养)

    根服务器收到后发现,这是com结尾的,于是返回负责com域名解析的服务器的IP给DNS服务器。

    DNS服务器收到后,就把关于该域名的请求发给负责com域名解析的服务器。

    负责com域名解析的服务器收到后发现,这是cnblogs.com结尾的,以cnblogs.com结尾的域名的解析权已经委派给XX服务器了,于是返回负责cnblogs.com域名解析的服务器的IP给DNS服务器。

    DNS服务器收到后,就把关于该域名的请求发给负责cnblogs.com域名解析的服务器。

    负责cnblogs.com域名解析的服务器收到后发现,这是我负责的域名,查询一下资源记录,OK找到了,于是发回i.cnblgos.com的对应IP给DNS服务器。

    DNS服务器千辛万苦终于得到该IP,自己先缓存一下,然后发回给我们的主机,结束。

    DNS冗余

    某个区域的资源记录通过手动或自动方式更新到主 DNS服务器上,辅 DNS 服务是为了防止主服务器无法访问或宕机。辅 DNS服务器定期与主 DNS 服务器通讯,确保它的信息保持最新。如果不是最新信息,辅 DNS服务器就会从主服务器获取最新信息的副本,称为区域复制。辅 DNS 服务器一般是3个小时查询一次是否主 DNS 服务器更新。

    DNS高速缓存

    为了减少Internet上DNS的通信量,所有的DNS服务器均使用高速缓存。

    Windows上清空DNS缓存的方法:命令行输入ipconfig/flushdns

    DNS资源记录类型

    A 将域名转为IP
    PTR 将IP转为域名
    CNAME 一个IP对应多个域名
    NS 该区域的DNS服务器
    SOA 该区域的主DNS服务器
    MX 邮件交换记录

     

     

    • A——主机记录,是使用最广泛的DNS记录,A记录的基本作用就是说明一个域名对应的IP是多少
    • PTR——指针记录,与A记录相反
    • CNAME——规范名字(Canonical Name)记录,也称为别名记录,用于说明一个IP对应多个域名
    • NS——名称服务器(Name Server)记录,用于说明这个区域有哪些DNS服务器负责解析
    • SOA——起始授权机构(Start Of Authority)记录,用于说明负责解析的DNS服务器中哪一个是主服务器
    • MX——邮件交换(Mail Exchange)记录

    DNS使用TCP还是UDP

    区域传送时DNS使用TCP,大多数情况(域名解析)使用UDP。

    为什么区域传送使用TCP?

    • 传送的内容多,TCP报文可超过512字节,UDP不能超过512字节
    • TCP可靠

    为什么域名解析使用UDP?

    • 查询域名的报文一般不超过512字节,使用UDP更快。
    • 万一失败,重发的损失也不大。

    一个例子

     

    假设客户端和服务器都没有DNS缓存,且Rlogin服务器收到IP数据报时需要进行主机名检查(利用IP报文中的IP地址向DNS服务器询问其对应域名,再利用该域名向DNS服务器询问其对应IP,再检查该IP是否跟IP报文中的源IP一致,好麻烦不知道为什么)。

    (1)Rlogin客户端中没有关于Rlogin服务器的域名解析,所以只能向根名字服务器查询Rlogin服务器的IP地址(这是一条A记录的查询)

    (2)根名字服务器当然不知道怎么解析,只告诉Rlogin客户端谁(图中的服务器的名字服务器)在负责这个域名的解析(这是一条NS记录)

    (3)Rlogin客户端收到后知道是服务器的名字服务器在负责,所以向服务器的名字服务器查询Rlogin服务器的IP地址(这是一条A记录的查询)

    (4)服务器的名字服务器返回的报文中包含了Rlogin服务器的IP地址(这是一条A记录的应答)

    (5)于是Rlogin客户端知道了Rlogin服务器的IP地址,于是与其建立TCP连接

    (6)此时我们情景设定Rlogin服务器需要进行主机名检查,于是利用TCP连接中得到的IP地址向根名字服务器(跟(1)中的不一定是同一个)查询Rlogin客户端的域名(这是一条PTR记录的查询)

    (7)根名字服务器当然不知道怎么解析,只告诉Rlogin服务器谁(图中的客户的名字服务器)在负责这个域名的逆解析(这是一条NS记录)

    (8)Rlogin服务器收到后知道是客户的名字服务器在负责,所以向客户的名字服务器查询Rlogin客户端的域名(这是一条PTR记录的查询)

    (9)客户的名字服务器返回的报文中包含了Rlogin客户端的域名(这是一条PTR记录的应答)

    (10)Rlogin服务器收到后知道了Rlogin客户端的域名后,向客户的名字服务器查询Rlogin客户端的IP地址(这是一条A记录的查询)

    (11)客户的名字服务器返回的报文中包含了Rlogin客户端的IP地址(这是一条A记录的应答)

    最后Rlogin服务器将得到的IP地址和TCP连接中的IP地址进行比对(为什么要主机名检查这么麻烦……)

  • 相关阅读:
    Tensorflow卷积接口总结
    《MuseGAN: Multi-track Sequential Generative Adversarial Networks for Symbolic Music Generation and Accompaniment》论文阅读笔记
    核函数
    KCF跟踪算法
    岭回归、lasso
    C++的命令行参数(gflag)
    Python的命令行参数(argparse)
    size_t为什么重要
    linux下caffe的命令运行脚本
    卡尔曼滤波
  • 原文地址:https://www.cnblogs.com/chenyg32/p/4105828.html
Copyright © 2020-2023  润新知