赞
踩
- IP拥有将数据跨网络从一台主机送到另一台主机的能力,但IP并不能保证每次都能够将数据可靠的送到对端主机,因此IP需要上层TCP为其提供可靠性保证,比如数据丢包后TCP可以让IP重新发送数据,最终在TCP提供的可靠性机制下IP就能够保证将数据可靠的发送到对端主机
- TCP除了对下层IP提供可靠性机制之外,TCP对上还提供进程到进程的服务,我们在进行socket编程时,本质就是在使用TCP或UDP为我们提供的进程到进程的服务
- 但数据在网络传输时需要一跳一跳的从一台主机跳到另一台主机,最终才能将数据转发到目标主机,因此要将数据发送到目标主机的前提是,需要先将数据转发给与当前主机直接相连的下一跳主机,而两台主机直接相连也就意味着这两台主机属于同一网段,因此将数据转发到下一跳主机实际是属于局域网通信范畴的,而这实际就是链路层需要解决的问题
- 也就是说,网络层IP提供的是跨网络发送数据的能力,传输层TCP是为数据发送提供可靠性保证的,而链路层解决的则是两台相连主机之间的通信问题
不同局域网所采用的通信技术可能是不同的,常见的局域网技术有以下三种:
以太网协议本质上就是相邻设备之间的数据转发,是局域网中通信的一种标准
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的
- 帧协议类型字段有三种值,分别对应IP协议、ARP协议和RARP协议
- 帧末尾是CRC校验码
MAC地址:每一个网卡设备在出厂的时候都会拥有一个全球独一无二的MAC地址,MAC地址也被称为硬件的地址
- MAC地址用来识别数据链路层中相连的节点
- 长度为48位, 及6个字节。 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改。 mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)
ifconfig
命令可以用于显示或设置网络设备的状态
- IP地址描述的是路途总体的 起点 和 终点
- MAC地址描述的是路途上的每一个区间的起点和终点
首先强调ARP协议并不是一个单纯的链路层的协议,而是介于数据链路层和网络层之间的协议
上面其实我们也谈到了以太网协议格式,我们可以看到格式中的目的地址和源地址指的是目的MAC地址和源MAC地址,换句话说,数据在数据链路层进行数据发送的时候,需要知道目标主机MAC地址,但是网络层的协议递交给数据链路层的数据仅仅包含目标主机的ip地址,我们无法获知其对应的MAC地址,那么,我们该如何获取目标主机的MAC地址呢?
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃
- 因此在通讯前必须获得目的主机的硬件地址
ARP协议就是用来解决此类问题的,他可以通过ip地址获取对应的MAC地址
注意:这里的ip地址本质上是通过路由项计算出来的接下来该条数据该去往的ip地址,而不是自己本身该去的ip地址
因此,可以说ARP协议是介于网络层和数据链路层之间的协议,话句话来说就是ARP协议建立了主机 IP地址 和 MAC地址 的映射关系
- 以太网首部和上面相同。但是ARP协议,类型设为0806
- 硬件类型:指链路层网络类型,1为以太网
- 协议类型:指要转换的地址类型,0800为IP地址,意思是通过IP地址找MAC地址
- 硬件地址长度:对于以太网地址为6字节
- 协议地址长度:对于IP地址为4字节
- op字段:为1表示ARP请求,为2表示ARP应答
- ARP协议先广播数据到居于网中,目的MAC地址为全1
- 每台主机收到数据后,解开以太网报头和IP报头,拿到目的IP地址
- 拿目的IP地址和字节主机的IP地址向比较,匹配就返回ARP响应
- 发送端收到响应就获得了对方的MAC地址
如果局域网中的主机没有目标主机,怎么知道对方的IP地址呢?(ARP字段要填写)
使用
arp -a 查看arp缓存表:
如果每发送一个IP数据报都要进行一次ARP请求以此确定MAC地址,那将会造成不必要的网络流量,因此,通常的做法是把获取到的MAC地址缓存(是指预见到同样的信息可能会再次使用,从而在内存中开辟一块区域记忆这些信息) 一段时间。即把第一次通过ARP获取到的MAC地址作为IP对MAC的映射关系记忆(记录IP地址与MAC地址对应关系的数据库叫做ARP表) 到一个ARP缓存表中,下一次再向这个IP地址发送数据报时不需再重新发送ARP请求,而是直接使用这个缓存表当中的MAC地址进行数据报的发送。每执行一次ARP,其对应的缓存内容都会被清除。不过在清除之前都可以不需要执行ARP就可以获取想要的MAC地址。这样,在一定程度上也防止了ARP包在网络上被大量广播的可能性
- 当然ARP是有老化时间的,老化时间为20min,会进行相应的更新
- ARP协议只能在子网内部使用,只能给子网内部的机器进行广播ARP请求。换句话说,只能获取子网内部机器的MAC地址
那么问题来了,IP地址和MAC地址缺一不可吗?
① 数据链路上只要知道接收端的MAC地址不就知道数据是准备发送给主机B的吗,那还需要知道它的IP地址吗?
② 只要知道了IP地址,即使不做ARP,只要在数据链路上做一个广播不就能发给主机B了吗?”那么,为什么既需要IP地址又需要MAC地址呢?
主机A想要发送IP数据报给主机B时必须得经过路由器C。即使知道了主机B的MAC地址,由于路由器C会隔断两个网络,还是无法实现直接从主机A发送数据报给主机B。此时,主机A必须得先将数据报发送给路由器C的MAC地址C1
如此看来,IP地址和MAC地址两者缺一不可。于是就有将这两个地址相关联的ARP协议(为了避免这两个阶段的通信带来过多的网络流量,ARP具有对IP地址和MAC地址的映射进行缓存的功能。有了这个缓存功能,发送IP包时就不必每次都发送ARP请求,从而防止性能下降)
- MTU(Maximum Transmission Unit):中文意思是最大传输单位
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据报小于46字节时,要在后面补充位数
- 最大值1500字节称为以太网的最大传输单元(MTU),不同网络类型有不同的MTU
- 如果一个数据包的长度超过了MTU,则需要对数据进行分片,分片是网络层IP做的
- 不同的数据链路层标准的MTU是不同的,在数据传输过程中,数据可能会被路由器继续分片
发送时,网络层IP协议的数据需要发送到链路层,由于MTU的影响,对于超过MTU的数据,IP要对其进行分片处理
- 同一组数据的每一个分片IP协议的16位标识id是相同的
- 每一个分片IP协议报头的3位标志段,第二位为0,表示允许分片,第三位为1,表示后面还有分片,第三位为0,表示后面没有分片
- 每一个分片IP协议报头的13为偏移量,表示的是当前分片距离起始位置的偏移量,用于接收端组装的
- 一旦一些分片丢失,数据重组失败,但是IP层不负责重传数据
- 负责数据重传的是传输层,准确来说是TCP协议,UDP协议不可靠
UDP协议的特点是:无连接,不可靠和面向数据报的
- 当一个UDP携带的数据超过1472(1500 - 8(UDP报头) - 20(IP报头))时,在IP层就一定会进行分片
- 分片之后,一个数据被分成了多份,说明,数据丢包的概率增加了
- 并且,UDP没有可靠性保证,数据不会重传
- TCP协议的一个数据报也不能是无限大的,不仅受之于流量控制,拥塞控制的影响,还受MTU的影响。TCP的有效载荷的最大消息长度,称为MSS
- TCP在建立连接,三次握手时,通信双方会进行MSS协商
- 双方SYN时会在TCP报头写入自己能支持的MSS值
- 双方知道知道对方的MSS后,选择最小值作为最终MSS
- MSS值在TCP报头填入位置在选项
虽然TCP会协商MSS,但是,仍然可能会被分片。接收端就收在组装时,如果发现一个分片丢失,接收端TCP收不到数据,就认为整个数据丢失,会让发送方,重发整个数据
MSS和MTU的关系:
DNS(Domain Name System,域名系统)协议,是一个用来将域名转化为IP地址的应用层协议
TCP/IP中通过IP地址和端口号的方式,来确定网络中一个主机上的一个程序。但IP地址是一长串数字,并不便于人们记忆,于是人们发明了一种叫做主机名的东西,并用hosts文件夹来描述主机名和IP地址之间的对应关系
最初,这个hosts文件是由互联网信息中心(SRI-NIC)来管理的
但这样太麻烦了,于是产生了DNS系统:
至今,我们的计算机上仍然保留了hosts文件,这个hosts文件当中一般存储的是主机名与IP地址之间的映射,用户也可以在hosts文件中自主添加域名和IP映射关系,在域名解析的过程中会优先查找hosts文件的内容
通过cat /etc/hosts
可以查看hosts文件当中的内容
DNS域名解析技术属于应用层技术,底层用的是UDP协议
域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,例如www.baidu.com
域名(倒着数级别):
- 一级域名:.com、.cn、.gov、.us
- 二级域名:baidu.com、jd.com、taobao.com
- 三级域名:baike.baidu.com
域名服务器:
- 根域名服务器:给其他域名服务器做授权使用
- 一级域名服务器:管理一级域名
- 二级域名服务器:管理二级域名
- 三级域名服务器:管理三级域名
至今, 我们的计算机上仍然保留了hosts文件,在域名解析的过程中仍然会优先查找hosts文件的内容
在浏览器中输入url
后,如果url
当中包含域名,则需要进行域名解析
域名解析流程:
递归域名解析过程:
或者:
我们可以使用dig工具来查看域名解析的过程,例如查看百度域名www.baidu.com
的解析过程
dig工具的分析结果如下:
结果解释:
NAT(Network Address Translation,网络地址转换)技术,是解决IP地址不足的主要手段,并且能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机
在IPv4协议中,IP地址数量不足是一个大问题,而NAT技术就是当前解决IP地址不够用的主要手段,是路由器的一个重要功能
假设某个局域网当中有A、B、C三台主机,在公网当中有一台服务器,以主机A访问公网中的这台服务器为例,我们来看看数据包在传输过程中IP地址的转换过程
数据包从局域网到公网的过程:
主机A向服务器发起数据请求的过程中,数据包中IP地址的转换过程如下:
- 刚开始,该数据包当中的源IP地址就是主机A的私有IP地址,目的IP地址就是服务器的公网IP地址
- 当数据包经过NAT路由器时,路由器会将该数据包的源IP地址替换成自己的WAN口IP地址,此时该数据包的源和目的IP地址就都是公网IP了
- 该数据包在互联网中经过各种路由转发,最终到达服务器主机
服务器收到主机A的数据请求并处理后,就会对主机A发来的请求进行响应
数据包从公网到局域网的过程:
服务器向主机A进行响应的过程中,数据包中IP地址的转换过程如下:
- 刚开始,该数据包当中的源IP地址就是服务器的公网IP地址,目的IP地址就是路由器的WAN口IP地址
- 数据包在互联网中经过各种路由转发,到达主机A所在局域网的NAT路由器,此时路由器会将该数据包的目的IP地址替换成主机A的私有IP地址
- 最终路由器就会将该数据包转发给局域网中的主机A
需要注意的是,因为主机A向服务器发起数据请求时,该数据包当中的源IP地址被替换成了NAT路由器的WAN口IP地址,相当于是该路由器代替主机A向服务器发起了数据请求,因此服务器发出的响应数据包的目的IP地址应该是NAT路由器的WAN口IP地址
- 私网对公网请求的时候:将网络数据当中的私网的源ip地址转化成为公网的ip地址
- 公网对私网的应答:将网络数据当中的公网的目的ip地址转化成为私网的ip地址
- 静态NAT:NAT协议,将一个私网和一个公网唯一进行映射管理
- 动态NAT:NAT管理的不止是一个公网ip,当私网数据到来的时候,选择一个空闲的ip进行映射
- 如上图,以10.0.0.10的源主机与163.221.120.9的目的主机进行通信为例。利用NAT,途中的NAT路由器将发送源地址从10.0.0.10转换为全局的IP地址(202.244.174.37)再发送数据。反之,当包从地址163.221.120.9发过来时,目标地址(202.244.174.37)先被转换成私有IP地址10.0.0.10以后再被转发(在TCP或UDP中,由于IP首部中的IP地址还要用于校验和的计算,因此当IP地址发生变化时,也需要相应地将TCP、UDP的首部进行转换)
- 总结一下就是:不管是静态NAT还是动态NAT,都没有缓解ipv4枯竭的问题,本质上还是一个私网IP一定要对应一个公网ip,才能访问互联网,这也是后面出现ipv6的原因之一
在进行私网ip转化为公网ip的时候,不仅仅将ip地址转换掉了,并且还将传输层的端口也转换掉了
主机163.221.120.9的端口号是80,LAN中有两个客户端10.0.0.10和10.0.0.11同时进行通信,并且这两个客户端的本地端口都是1025。此时,仅仅转换IP地址为某个全局地址202.244.174.37,会令转换后的所有数字完全一致。为此,只要将10.0.0.11的端口号转换为1026就可以解决问题。如图所示,生成一个NAPT路由器的转换表,就可以正确地转换地址跟端口的组合,令客户端A、B能同时与服务器之间进行通信
这种转换表在NAT路由器上自动生成。例如,在TCP的情况下,建立TCP连接首次握手时的SYN包一经发出,就会生成这个表。而后又随着收到关闭连接时发出FIN包的确认应答从表中被删除(UDP中两端应用进行通信时起止时间不一定保持一致,因此在这种情况下生成转换表相对较难)
注:在使用TCP或UDP的通信当中,只有目标地址、源地址、目标端口、源端口以及协议类型(TCP还是UDP)五项内容都一致时才被认为是同一个通信连接。此时所使用的正是NAPT
NAT技术进行私有IP和公网之间的替换,主要就是依赖NAT路由器当中维护的网络地址转换表,但这张转换表也体现出了NAT的一些缺陷:
代理服务器(Proxy Server)的功能就是代理网络用户去取得网络信息,代理服务器又分为正向代理和反向代理
正向代理:
正向代理,是一个位于客户端和目标服务器之间的服务器,客户端并不直接访问目标服务器,而是先访问代理服务器,由代理服务器代替客户端去访问对应的目标服务器,并将目标服务器的响应结果返回给客户端
比如公司内部一般都会有自己的服务器,当我们使用公司内网上网时:
- 我们对外网发起的数据请求,首先会转发到公司的这台服务器上,然后由公司的这台服务器代替你对外网进行访问
- 当公司的服务器收到对应外网的响应数据后,再由公司的这台服务器将数据转发给你
正向代理的好处:
- 正向代理最大的一个好处就是可以加速资源访问
- 比如公司中大量员工都要访问外网的同一个资源,那么正向代理服务器就可以将对应的资源缓存到本地,此时当其他人要访问该资源时,直接在正向代理服务器就可以获取,而不需要再次进行外网访问
反向代理:
反向代理,也是一个位于客户端和目标服务器之间的服务器,对于客户端而言,反向代理服务器就相当于目标服务器,用户不需要知道目标服务器的地址,用户只需要访问反向代理服务器就可以获得目标服务器提供的服务
反向代理,也是一个位于客户端和目标服务器之间的服务器,客户端直接向反向代理服务器发起数据请求,然后再由反向代理服务器将客户端的数据请求转发给真正的目标服务器进行处理,数据处理完毕后反向代理服务器再将数据结果返回给客户端
比如域名
www.baidu.com
对应的服务器实际就是一个反向代理服务器
- 百度内部实际并不是只有一台服务器,但不同地区的人们都可以通过访问www.baidu.com享受到百度提供的服务,实际我们访问的就是百度的反向代理服务器
- 当这台反向代理服务器收到客户端的数据请求后,就会将我们的数据请求转发给百度内部的某台服务器进行数据处理,然后再将数据处理的结果返回给客户端
反向代理的好处:
- 反向代理可以起到负载均衡的作用。比如不设置反向代理服务器,那么用户在访问百度时,就会随机访问到百度内部的某台服务器,此时就可能导致某些服务器压力太大,而某些服务器却处于闲置状态。而设置了反向代理服务器后,我们就能够通过某些方法让用户的数据请求较为平均的落到每台服务器上
- 反向代理还能起到安全防护的作用。有了方向代理服务器后,我们不需要直接将提供服务的服务器对应的信息暴露出去,此外,当由非法请求发送到反向代理服务器时,反向代理服务器就相当于一层软件屏障,可以在反向代理服务器当中部署一些防护措施,让这些非法请求在反向代理服务器这里就被过滤掉,而不会影响内部实际提供服务的服务器
需要注意的是,代理服务器的主要工作只是对数据进行转发,因此代理服务器处理数据的压力不会特别大,并且代理服务器也可以有多个,因此不必担心代理服务器过载的情况
正向代理和反向代理的异同:
正向代理和反向代理的相同点
- 正向代理服务器和反向代理服务器都是位于客户端和服务器之间的
- 正向代理服务器和反向代理服务器的主要工作,都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端
正向代理和反向代理的不同点
- 正向代理是客户端的代理,帮助客户端访问其无法访问的服务器资源的,而反向代理则是服务器的代理,帮助服务器做负载均衡、安全防护等工作的
- 正向代理一般是客户端架设的,比如公司的正向代理服务器是公司作为客户端架设的,而反向代理一般是服务端架设的,比如百度的反向代理服务器是百度作为服务端架设的
- 正向代理中,服务器不知道真正的客户端到底是谁,服务器认为正向代理服务器就是真实的客户端,而反向代理中,客户端不知道真正的服务器是谁,客户端认为反向代理服务器就是真实的服务器
NAT和代理服务器的区别:
NAT和代理服务器都是代替我们向服务器发起数据请求的,但它们有如下区别:
- 从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题,而代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用的代理服务器
- 从底层实现上讲,NAT工作在网络层,直接对IP地址进行替换,而代理服务器往往工作在应用层
- 从使用范围上讲,NAT一般在局域网的出口部署,而代理服务器可以在局域网代理,也可以在广域网代理,也可以跨网代理
- 从部署位置上看,NAT一般集成在防火墙、路由器等硬件设备上,而代理服务器则是一个软件程序(比如Nginx和Apache),需要部署在服务器上
ICMP的主要功能包括:
- 确认IP包是否成功到达目标地址
- 通知在发送过程中IP包丢弃的原因
- ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要使用ICMPv6
当发送的数据包到达主机B所在局域网的入口路由器时,入口路由器为了获得主机B的MAC地址,于是会向主机B发送ARP请求包,但由于主机B已经离线了,因此路由器在多次发送ARP请求包而得不到响应后,就会返回一个ICMP Destination Unreachable的包给主机A,此时主机A就知道自己发送的数据无法到达主机B
ICMP大概分为两类报文:
- 一类是通知出错原因的
- 一类是用于诊断查询的
ICMP包常见类型如下:
ping命令是基于ICMP协议实现的,通常用于测试本地主机与另一台主机之间的通信信道是否正常
例如,使用ping www.baidu.com
命令,测试本地主机与百度服务器之间的通信信道是否正常
- 注意,此处ping的是百度的域名,该域名会由DNS解析成IP地址
- ping命令不仅能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live,生存时间)
- ping命令会先发送一个ICMP Echo Request给对端
- 对端接收到之后,会返回一个ICMP Echo Reply
traceroute命令也是基于ICMP协议实现的,traceroute命令可以遍历数据包传送到目标主机所经过的所有路由器
例如,使用traceroute www.baidu.com
命令,遍历数据包传送到百度服务器所经过的所有路由器
原理简述:
- traceroute命令底层实际是通过增加存活时间(TTL)值来实现的
- 因为每当数据包经过一个路由器,其TTL值就会减1,当TTL值减为0时对应路由设备就会将该数据包丢弃,并传送一个ICMP TTL数据包给发送主机
- 因此traceroute命令底层可以发出多个数据包,并给这些数据包设置不同的TTL值,最后该主机就能够得到一连串的数据包路径
问题:telnet对应的端口号是23,ssh对应的端口号是22,那ping对应的端口号是多少?
这是面试官设的一个圈套,ping命令是基于网络层的ICMP协议,而端口号是属于传输层的内容,因此ICMP协议根本就不关心端口号这样的信息
因此,ping命令实际是绕过了传输层的,在Linux当中实际也有绕过传输层的一套网络编程接口,叫做原生套接字
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。