目录
- 网络层协议和数据链路层协议
- 1.IP协议
- 1.1IP协议报头
- 1.2子网划分
- 1.3特殊IP地址
- 1.4IP地址的数量限制
- 1.5公网IP地址和私有IP地址
- 1.6路由
- 2.数据链路层
- 2.1以太网
- 2.1.1认识以太网
- 2.1.2以太网帧格式
- 2.2MAC地址
- 2.3碰撞检测
- 2.4交换机
- 2.5MTU
- 2.5.1MTU对IP协议的影响
- 2.5.2MTU对UDP的影响
- 2.5.3MTU对TCP的影响
- 2.6ARP协议
- 2.6.1ARP协议的工作流程
- 2.6.2ARP数据报的格式
- 2.6.3ARP请求和应答过程
- 3.DNS
- 3.1DNS的背景
- 3.2域名简介
- 4.面试开放题
- 5.ICMP协议
- 5.1ICMP报头格式
- 5.2ping命令
- 6.NAT技术
- 6.1NAT转换过程
- 6.2NAPT
- 6.3NAT的缺陷
- 6.4NAT与代理服务器
- 7.总结
- 7.1数据链路层
- 7.2网络层
- 7.3传输层
- 7.4应用层
网络层协议和数据链路层协议
1.IP协议
IP协议属于是网络层的协议,udp/tcp是传输层的协议
IP地址的核心作用,就是定位主机,具有把数据从A主机跨网络传输到B主机的能力
主机: 配有IP地址, 但是不进行路由控制的设备; 路由器: 即配有IP地址, 又能进行路由控制; 节点: 主机和路由器的统称;
1.1IP协议报头
4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.
4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节.
8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.
16位总长度(total length): IP数据报整体占多少个字节.
16位标识(id): 唯一的标识主机发送的报文. 如果IP报文被分片了, 那么每一个片里面的这个id都是相同的.
3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为0, 其他是1. 类似于一个结束标记.
13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)
13位分片偏移和16位表示这两个字段不会频繁的用到,这是为了对报文进行分片和组装的
因为数据链路层的mac帧期望一个报文的大小不要超过1500字节,而决定报文大小的是tcp协议,不是IP 协议,但是有些时候,万一TCP传了个很大的报文来,那IP协议自己要处理,处理完才能交给数据链路层。因此就需要IP协议去对报文进行分片和组装【即,发送方的IP协议进行分片,接收方的IP协议进行组装】
那分片和组装,有一些问题,可以弄清楚一些——简单来说,通过3位标志字符的第三位,以及片偏移量的值,来判断报文是否被分片,是否是最后一个报文,判断如何收全的话,直接排序,当前的起始位置+自身长度=下一个报文的偏移量大小
分片这个情况其实最好不要发生,因为任意一个丢失了,就无法组装成功
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
8位协议: 表示上层协议的类型
16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.
32位源地址和32位目标地址: 表示发送端和接收端
1.2子网划分
首先先来回答一个问题,为什么要进行子网划分?——答案是为了提高排除效率,即更高效率的定位到目标主机
IP地址分为两个部分, 网络号和主机号
网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号
不同的子网其实就是把网络号相同的主机放到一起.
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情.
有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.
过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示
A类 0.0.0.0到127.255.255.255
B类 128.0.0.0到191.255.255.255
C类 192.0.0.0到223.255.255.255
D类 224.0.0.0到239.255.255.255
E类 240.0.0.0到247.255.255.255
随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址;
例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.
然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了.
针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing):
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;
将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
例子2的计算如下,网络号的计算是——IP地址和子网掩码按位与
1.3特殊IP地址
将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
1.4IP地址的数量限制
IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方个IP地址, 大概是43亿左右. 而TCP/IP 协议规定, 每个主机都需要有一个IP地址.
这意味着, 一共只有43亿台主机能接入网络么?
实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址.
CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:
动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;
NAT技术(目前的主流应用技术,NAT(Network Address Translation,网络地址转换).
IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;
1.5公网IP地址和私有IP地址
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址
10.,前8位是网络号,共16,777,216个地址*
*172.16.到172.31.,前12位是网络号,共1,048,576个地址
192.168.,前16位是网络号,共65,536个地址
包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公网IP);
一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.
1.6路由
在复杂的网络结构中, 找出一条通往终点的路线;【是一个路由一个路由跳着走的】
IP数据包的传输过程和问路一样
当IP数据包, 到达路由器时, 路由器会先查看目的IP;
路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
依次反复, 一直到达目标IP地址;
那么如何判定当前这个数据包该发送到哪里呢?这个就依靠每个节点内部维护一个路由表;
路由表可以使用route命令查看
如果目的IP命中了路由表, 就直接转发即可;
路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
假设某主机上的网络接口配置和路由表如下:
这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络;
路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
那路由器到底是如何通过路由表来查找目的地址,是否在当前路由表内呢?
转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3
- 跟第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符
- 再跟第二行的子网掩码做与运算得到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去;
- 由于192.168.56.0/24正是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;
转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2
- 依次和路由表前几项进行对比, 发现都不匹配;
- 按缺省路由条目, 从eth0接口发出去, 发往192.168.10.1路由器;
- 由192.168.10.1路由器根据它的路由表决定下一跳地址;
2.数据链路层
IP协议能够将数据从A主机跨网络传输到B主机,这句话没问题,但是我们知道,A主机到B主机之间,还需要通过多个路由器,从数个局域网/子网中传输。因此——网络传输的本质可以说是,在无数个局域网之间进行传输
局域网的传输原理其实之前就讲过,这里复习一下
一个主机向局域网内的一个另一个主机发数据,这个局域网内的所有主机都能收到对应的MAC帧,只是在查看报头内的目的MAC地址,如果不是自己的MAC地址就直接丢弃,所以上层根本不知道收到过MAC帧,只有目的MAC地址会接收并向上层分用,然后解包,进行业务处理等。
注意:网卡在局域网中有一种模式叫做混杂模式,即不丢弃任何数据直接抓取,很多抓包工具就是这样做的
主机A得先保证能把数据传输到最近的路由器,这就需要数据链路层的协议了
2.1以太网
2.1.1认识以太网
“以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
2.1.2以太网帧格式
源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;【每个主机都会自带一张网卡,每个网卡都有唯一的MAC地址】
帧协议类型字段有三种值,分别对应IP、ARP、RARP;
帧末尾是CRC校验码。
2.2MAC地址
MAC地址用来识别数据链路层中相连的节点;
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).
注意:IP地址和MAC地址要分清
IP地址描述的是路途总体的 起点 和 终点;
MAC地址描述的是路途上的每一个区间的起点和终点;(局域网内)
2.3碰撞检测
在局域网中,任何时候,有且只能有一个主机在发送消息,如果多个消息被同时发送,那么会导致局域网中的数据发生数据碰撞,导致数据无效
解决的方法一般来说就是以太网(检测到数据碰撞就暂停发消息,过一会在发)和令牌环(那个主机持有令牌环就能发消息)
其实这里的局域网非常像之前学的临界资源——被当前所有主机共享,所以不论是以太网还是令牌环,都是在保证临界资源被使用时,只能有一个主机在使用,即只能有一台主机在局域网发消息
2.4交换机
由于局域网不能太大,太大就会导致数据发生碰撞的概率变高,但是总有时候局域网会比较大,这个时候一般就会有交换机来划分碰撞域。
原理很简单,当数据发生碰撞的时候,只会发生在某个被划分的碰撞域,而不会影响其他碰撞域的主机,但是这些碰撞域都处于一个局域网,如果有主机的发送数据的目标MAC地址是其他碰撞域的主机,由交换机负责数据的转发,如果目标MAC地址在自己的碰撞域,那交换机不会做处理,这样就能降低局域网的碰撞概率
2.5MTU
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
不同的数据链路层标准的MTU是不同的;
查看本机的MTU输入ifconfig就可以看到了
2.5.1MTU对IP协议的影响
由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.
将较大的IP包分成多个小包, 并给每个小包打上标签;
每个小包IP协议头的 16位标识(id) 都是相同的;
每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据
如果设置不能切片的话,那走的路径就是最大吞吐量路径
2.5.2MTU对UDP的影响
一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了.
2.5.3MTU对TCP的影响
TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);
TCP在建立连接的过程中, 通信双方会进行MSS协商.
最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
MSS的值就是在TCP首部的40字节变长选项中(kind=2);-
MSS和MTU的关系
2.6ARP协议
需要强调,ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议;
为什么需要ARP协议,是有原因的——那就是路由器在选择好路径之后,需要将数据封装成为MAC帧,然后发送给目的主机,但是从一开始的时候,数据从发送主机发出的时候,就没有携带目的主机的MAC地址,而是携带的IP地址。那路由器是如何知道目的主机的MAC地址的呢?
这是因为ARP协议,将IP地址,转化为了MAC地址**【即ARP协议建立了主机 IP地址和 MAC地址的映射关系.】**
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
因此在通讯前必须获得目的主机的硬件地址;
2.6.1ARP协议的工作流程
源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址
2.6.2ARP数据报的格式
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
硬件类型指链路层网络类型,1为以太网;
协议类型指要转换的地址类型,0x0800为IP地址;
硬件地址长度对于以太网地址为6字节;
协议地址长度对于和IP地址为4字节;
op字段为1表示ARP请求,op字段为2表示ARP应答
2.6.3ARP请求和应答过程
结合ARP数据报格式和工作流程,完成的总结一次,在以太网/局域网中,路由器如何得到目的主机的MAC地址。
首先,当路由器拿到数据,需要将数据发送给目的主机时,由于没有MAC地址,因此无法在以太网中发送给目的主机,所以,需要通过ARP请求得到目的主机的MAC地址,那具体是如何做的呢,首先他会先调用ARP请求,开始填充ARP数据报,并封装好以太网报头,以mac帧发送到以太网中。
要注意其内部填的数据,FFFFFF表示不知道,op字段很重要,1表示ARP请求,2表示ARP应答。
而以太网中,所有主机都能收到这个mac帧,于是变进行处理,查看报头中的目的MAC地址是否是自己,发现是FFFFFF,就进行解包,随后向上查看帧类型,发现是ARP协议类型,就分用交付给ARP协议,ARP协议就查看ARP数据报,发现op字段是1,就知道是ARP请求(一定要先查看op字段,因为所有主机都能收到ARP请求或应答),然后查看其目的IP地址是否是自己,如果不是自己,就直接丢弃(在ARP协议层丢弃的!)。
而只有目的主机发现ARP数据报中的目的IP是自己,随后就将自己的MAC地址填入数据报,并填好ARP数据报其他字段,随后封装好以太网报头,发送mac帧到以太网中。此时依旧是所有主机都能接受到这个mac帧,但是除了发送主机,其他主机在看到以太网报头中的目的MAC地址不是自己之后,就直接将数据丢弃了(是在数据链路层丢弃的!没有向上分用),而发送主机也会查看帧类型,发现是ARP类型,就分用给ARP协议,op字段为2,即ARP应答。
于是发送主机就拿到了目的主机的MAC地址,然后就将IP协议的数据封装好,以mac帧发到以太网中,目的主机接受到数据并接收,向上分用给IP协议层。此时就完成了发送主机发送数据给目的主机
3.DNS
DNS是一整套从域名映射到IP的系统
3.1DNS的背景
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆. 于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系
最初, 通过互连网信息中心(SRI-NIC)来管理这个hosts文件的.
如果一个新计算机要接入网络, 或者某个计算机IP变更, 都需要到信息中心申请变更hosts文件.其他计算机也需要定期下载更新新版本的hosts文件才能正确上网.
这样就太麻烦了, 于是产生了DNS系统.
一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系.
如果新计算机接入网络, 将这个信息注册到数据库中;
用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
至今, 我们的计算机上仍然保留了hosts文件. 在域名解析的过程中仍然会优先查找hosts文件的内容.
输入cat /etc/hosts即可查看
3.2域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称.
域名使用 . 连接
com: 一级域名. 表示这是一个企业域名. 同级的还有 “net”(网络提供商), “org”(非盈利组织) 等.
baidu: 二级域名, 公司名.
www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议.
如果对域名解析过程感兴趣,可以去网络搜取资料,或者使用dig工具分析DNS过程
更多dig使用方法
4.面试开放题
浏览器中输入url后发生的事情?
这是一个经典的面试题. 没有固定答案, 越详细越好
最好是从多方面来回答,比如,我打算从单纯应用层的角度以及数据在传输中经过的协议和可能遇到的一些底层问题来详细解答
- 从应用层来看:当我们输入了url后,发生的先是DNS域名解析,得到IP地址好和端口号,然后客户端封装报文,经过http/https协议后,发送请求到目的服务器端,然后服务器端接受到报文,拿出数据,进行业务逻辑处理,将应答封装成报文,发回客户端。在这当中只要客户端和服务端往往会做cookie技术处理,即将用户的数据,保留下来,下次登录自动登录。并且还会涉及到长链接的问题,来解决频繁创建链接的问题
- 从数据的传输角度来看,就可以从传输层的tcp/udp,网络层的ip,数据链路层的mac帧/ARP协议开始讲起。传输层的tcp协议来进行传输控制,这里涉及到滑动窗口/拥塞控制/链接管理/超时重传之类的等等可以保证可靠性的机制,网络层就涉及到,路由器的路由选择/子网划分/公网ip/子网ip等,而路由选择之后还得保证数据链路层的数据传输没有问题,又这几到了mac帧/mac地址,传输涉及到碰撞检测,交换机的作用,以及MTU的限制,并且,mac地址的获取又涉及到ARP协议的请求和应答过程。
5.ICMP协议
ICMP协议是一个网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因.
ICMP正是提供这种功能的协议; ICMP主要功能包括:
确认IP包是否成功到达目标地址.
通知在发送过程中IP包被丢弃的原因.
ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;
5.1ICMP报头格式
ICMP大概分为两类报文:
- 一类是通知出错原因
- 一类是用于诊断查询
5.2ping命令
注意, 此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址.
ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期).
ping命令会先发送一个 ICMP Echo Request给对端;
对端接收到之后, 会返回一个ICMP Echo Reply;
注意:ping命令基于ICMP, 是在网络层. 而端口号, 是传输层的内容. 在ICMP中根本就不关注端口号这样的信息
6.NAT技术
之前我们讨论了, IPv4协议中, IP地址数量不充足的问题
NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;
NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;
6.1NAT转换过程
NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;
在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;
当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系;
6.2NAPT
那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项
6.3NAT的缺陷
由于NAT依赖这个转换表, 所以有诸多限制:
无法从NAT外部向内部服务器建立连接;
装换表的生成和销毁都需要额外开销;
通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;
6.4NAT与代理服务器
路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.
代理服务器看起来和NAT设备有一点像. 客户端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.
那么NAT和代理服务器的区别有哪些呢?
从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器.
从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.
代理服务器是一种应用比较广的技术
翻墙: 广域网中的代理.
负载均衡: 局域网中的代理
代理服务器又分为正向代理和反向代理
正向代理部署在客户端,帮助客户端访问无法直接访问的资源;反向代理部署在服务器端,帮助服务器处理来自客户端的请求。
下面是一个正向代理的例子:
正向代理一个很好的例子就是学校的校园网之类的,如果多个同学要访问同一个资源,此时校园网就能识别到这个资源已经被缓存了,就直接在内网中将资源给到客户端,这样绕过公网,速度快得多。还有就是,当有客户端想要访问外网,此时学校直接给你掐掉了这个访问,因为它认为不安全。这都是替用户去访问资源,是正向代理,对请求本身做管理
下面是一个反向代理的例子:
很多时候,一个公司的服务器都有很多的主机,但是客户端的请求要去到那个主机也是一个问题,所以一般都会弄一个入口的服务器,这个就是反向代理。它的作用就是均匀的分配客户端的请求到各个主机上,让每个主机的压力都差不多,这交负载均衡。
这里讲一下在国内要如何访问外网资源:
其实就是将要访问的数据加密,作为报文有效载荷,然后发送到可以访问的外网的服务器上,然后服务器解密,然后访问外网资源,拿到资源后,将资源加密,在发送会客户端,就实现了一次翻墙
翻墙其实就是一个基于公网的正向代理
7.总结
7.1数据链路层
数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据
以太网是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
以太网帧格式
理解mac地址
理解arp协议
理解MTU
7.2网络层
网络层的作用: 在复杂的网络环境中确定一个合适的路径.
理解IP地址, 理解IP地址和MAC地址的区别.
理解IP协议格式.
了解网段划分方法
理解如何解决IP数目不足的问题, 掌握网段划分的两种方案. 理解私有IP和公网IP
理解网络层的IP地址路由过程. 理解一个数据包如何跨越网段到达最终目的地.
理解IP数据包分包的原因.
了解ICMP协议.
了解NAT设备的工作原理
7.3传输层
传输层的作用: 负责数据能够从发送端传输接收端.
理解端口号的概念.
认识UDP协议, 了解UDP协议的特点
认识TCP协议, 理解TCP协议的可靠性. 理解TCP协议的状态转化.
掌握TCP的连接管理, 确认应答, 超时重传, 滑动窗口, 流量控制, 拥塞控制, 延迟应答, 捎带应答特性.
理解TCP面向字节流, 理解粘包问题和解决方案.
能够基于UDP实现可靠传输.
理解MTU对UDP/TCP的影响.
7.4应用层
应用层的作用: 满足我们日常需求的网络程序, 都是在应用层
能够根据自己的需求, 设计应用层协议.
了解HTTP协议.
理解DNS的原理和工作流程
定了网络拓扑结构, 访问控制方式, 传输速率等;
以太网帧格式
理解mac地址
理解arp协议
理解MTU