计算机网络模型

编程知识 更新时间:2023-04-28 12:47:53

目录

前言

网络模型

OSI模型

TCP/IP模型

物理层(Physical)

数据链路层(Data Link)

Ethernet协议

mac地址

 广播

ARP协议

ARP协议工作流程

网络层(Network)

IP协议

IP地址组成

子网掩码

IP数据包

传输层(Transport)

UDP与TCP

UDP协议

TCP协议

TCP报文段的首部格式

TCP可靠传输的实现

TCP传输连接管理

连接建立(三次握手)

连接释放(四次挥手)

会话层(Session)

Socket

表示层(Presentation)

应用层(Application)

Telnet协议(teletype network)

DNS协议

Http协议

Get和Post

Cookie和Session

Http与Https

网络通信的实现

网络通信流程



新型冠状病毒(Corona Virus Disease 2019,COVID-19)          ——  2022-4-28 

前言

网络分为局域网、城域网和广域网 ,网络通信需要以网络安全为基石,网络安全协议通过多层次设计,提升了系统的复杂性和多样性,从根本上保障了互联网系统的稳定性能,创造了良好的网络运营环境,为计算机通信提供了良好的安全屏障,有利于计算机通信的顺利进行,同时节省了通信设计成本。通信线路互相连接的许多自主工作的计算机构成的集合体,各个部件之间以何种规则进行通信,就是网络模型研究的问题,网络模型一般是指OSI七层参考模型和TCP/IP四层参考模型。这两个模型在网络中应用最为广泛。网络模型每一层都有对应的网络协议(网络通信的规范)。

网络模型

OSI模型

OSI模型(Open System Interconnection Reference Model),一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。

osi七层协议数据传输封包与解包过程

每层运行常见物理设备

TCP/IP模型

TCP/IP协议是由七层模型简化而来。分别是主机到网络层(比特流Bits)、网络层、传输层、应用层。每一层对于上一层来讲是透明的,上层只需要使用下层提供的接口,并不关心下层是如何实现的。

网络请求过程

简单理解:客户端浏览器输入:http://www.baidu,然后询问DNS获取百度服务器的IP地址,拿到地址后发送HTTP请求,经过3次握手建立客户端与服务端的连接,然后客户端发送http请求报文,服务端响应http请求报文,最后通过四次握手释放连接。

物理层(Physical)

物理层主要是基于电器特性发送高低电压(电信号)传输比特流(Bits),高电压对应数字1,低电压对应数字0,定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。

数据链路层(Data Link)

数据链路层定义了电信号的分组方式,规定电信号多少位一组,每组代表什么。这一层还提供了对传输数据的检测和传输数据错误的纠正以确保数据的可靠传输。例如:Wi-Fi(IEEE 802.11) 、以太网 、FDDI 。

Ethernet协议

以太网(Ethernet)是现实世界中最普遍的一种计算机网络。有两类:第一类是经典以太网,第二类是交换式以太网,使用了一种称为交换机的设备连接不同的计算机。经典以太网是以太网的原始形式,运行速度从3~10 Mbps不等;而交换式以太网正是广泛应用的以太网,可运行在100、1000和10000Mbps那样的高速率,分别以快速以太网、千兆以太网和万兆以太网的形式呈现。ethernet规定一组电信号构成一个数据包叫做‘帧’,每一数据帧分成报头head和数据data两部分。head(固定18个字节):发送者/源地址(6个字节),接收者/目标地址(6个字节),数据类型(6个字节)。data(最短46字节最长1500字节):head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送。

数据字段:以太网最小规定为64字节,不足的也会填充到64字节。以太网包的最大长度是1518字节,数据字段长度范围为46到1500,这是为什么呢?因为以太网包最小规定为64字节,不足的也会填充到64字节。而以太网帧格式的其他部分加起来是6+6+2+4=18字节,
所以数据部分的最小长度为64-18=46字节;而以太网包的最大长度是1518字节,因此1518-18=1500字节

mac地址

head中包含的源地址和目标地址:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。

mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)。

 ipconfig                       ... 显示信息
    > ipconfig /all                  ... 显示详细信息
    > ipconfig /renew                ... 更新所有适配器
    > ipconfig /renew EL*            ... 更新所有名称以 EL 开头
                                         的连接
    > ipconfig /release *Con*        ... 释放所有匹配的连接,
                                         例如“有线以太网连接 1”或
                                             “有线以太网连接 2”
    > ipconfig /allcompartments      ... 显示有关所有隔离舱的
                                         信息
    > ipconfig /allcompartments /all ... 显示有关所有隔离舱的
                                         详细信息

快捷键 WIN+R 输入cmd 回车键进入dos界面 输入ipconfig /all 然后点击回车键,在返回信息中,找到 以太网适配器 其中的物理地址(Physical Address),即为本机的mac地址,如图: 

 广播

有了mac地址,同一网络内的两台主机就可以通信了(一台主机通过ARP协议获取另外一台主机的mac地址)。ethernet采用最原始广播的方式进行通信:

ARP协议

地址解析协议,即ARP(Address Resolution Protocol),ARP协议在TCP/IP模型中属于网络层,在OSI模型中属于链路层,通过IP地址获取物理地址的协议所有上层的包到最后都要封装到以太网头部,然后通过以太网协议发送。通信是基于mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议。

arp协议功能:广播的方式发送数据包,获取目标主机的mac地址

例如:主机172.16.10.10/24访问172.16.10.11/24

通过ip地址和子网掩码区分是否处于同一网络,如果在同一网络 根据目标ip获取目标主机mac,如果不是同一网络获取目标ip的网关mac。数据包会以广播的方式在发送端所处的网内传输,所有主机接收后拆开包,发现目标ip为自己的,响应返回自己的mac。

ARP协议工作流程

1、每台主机都会在自己的ARP缓冲区建立一个ARP列表,以表示IP地址和MAC地址的对应关系。当源主机需要将一个数据包发送到目的主机时,会先检查自己的ARP列表中是否存在该IP地址对应的MAC地址,如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址,硬件地址,以及目的主机的IP地址。

2、同一网络内所有主机收到ARP请求之后,会检查数据包中的目的IP是否和自己的IP地址一致,如果不一致就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP列表中已经存在该IP的信息,则将其覆盖,然后将自己的MAC地址写入ARP响应数据包中发送给源主机。

3、源主机收到这个ARP响应数据包之后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
 

网络层(Network)

有了ethernet、mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网是由一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到。所以必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包)。引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址

数据要传输到哪(目的地) 即路由器、交换机那些具有寻址功能的设备所实现的功能(像路由器可以选择最佳传输路径)。这一层定义的是IP地址,通过IP地址寻址所以产生了IP协议。例如:IP (IPv4 · IPv6) 、 ICMP、ICMPv6、IGMP等。

IP协议

规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示。表示范围0.0.0.0-255.255.255.255。一个ip地址通常写成四段十进制数,例如:172.16.10.1。

IP地址组成

IP地址由两部分组成:网络部分(标识子网),主机部分(标识主机)。单纯的ip地址段只是标识了ip地址的种类,从网络部分或主机部分都无法辨识一个ip所处的子网。例:172.16.10.1与172.16.10.2并不能确定二者处于同一子网。

子网掩码

子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在广域网上。它在形式上等同于IP地址,是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。通过子网掩码就能判断任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

比如,已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算

172.16.10.1:10101100.00010000.00001010.000000001
255255.255.255.0:11111111.11111111.11111111.00000000
AND运算得网络地址结果:
10101100.00010000.00001010.000000001->172.16.10.0


172.16.10.2:10101100.00010000.00001010.000000010
255255.255.255.0:11111111.11111111.11111111.00000000
AND运算得网络地址结果:
10101100.00010000.00001010.000000001->172.16.10.0

结果都是172.16.10.0,因此它们在同一个子网络

IP数据包

ip数据包也分为head和data部分,无须为ip包定义单独的栏位,直接放入以太网包的data部分

head:长度为20-60字节

data:最长为65,515字节。

而以太网数据包的”数据”部分,最长只有1500字节。因此如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。

传输层(Transport)

以哪种协议发送数据(从一台计算机的进程传输到另外一台计算机的进程中)。例如:TCP 、 UDP 、TLS、 DCCP、 SCTP、RSVP 、OSPF 等。

网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后每个主机上使用的都是应用程序,电脑上可能同时开启qq,暴风影音等多个应用程序,通过ip和mac找到了一台特定的主机,如何标识这台主机上的应用程序,然后就出现了端口号,端口号即应用程序与网卡关联的编号。

为何要有传输层

网络层是主机与主机之间的通讯,而传输层则是主机内进程与进程之间的通讯。进程是资源分配的基本单位,计算机之间的信息传输也只是一台计算机的进程传输到另外一台计算机的进程中。传输层主要功能是建立端口到端口间的通信。端口范围0-65535,0-1023为系统占用端口。

一台计算机如何找到另外一台计算机

通过IP协议来完成的(复用多个进程都可以把信息通过传输层到IP层,再传输到另外一台计算机中)。

如何找到另外一台计算机的进程(pid)

通过端口,到达另外一台计算机后还要通过端口号找到对应进程。

UDP与TCP

TCP用于发大量数据,一台电脑发了1万个包出去,另一台电脑就要告诉发送者是否接受到了1万个包,如果缺了3个包,就告诉我是哪几个包丢了,然后再发一次。这样就保证了对方把数据完整接收。TCP可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

UDP用于发送少量数据的。我发20个包出去,一般不会丢包,所以,我不管你收到多少个。在多人互动游戏,也经常用UDP协议,因为一般都是简单的信息,而且有广播的需求。如果用TCP,效率就很低,因为它会不停地告诉主机我收到了20个包,或者我收到了18个包,再发我两个!如果同时有1万台计算机都这样做,那么用TCP反而会降低效率,还不如用UDP,主机发出去就算了,丢几个包你就卡一下,算了,下次再发包你再更新。

UDP协议

特点:

  • 无连接,传输数据时不需要建立连接,减小开销

  • 尽最大努力交付,不确保可靠交付

  • 面向报文

  • 没有拥塞控制、确保信息实时性

  • 支持一对一,一对多,多对一,多对多

  • 首部开销小,只有8个字节

UDP的首部格式(UDP头)

  • 源端口,发送方的端口

  • 目标端口,接收方的端口

  • 长度,首部长度 + 用户数据包的长度(可以没有数据包,所用最小值为8)

  • 检验和,检查UDP用户数据传输中是否与错,有错就丢弃(检查首部长度 + 用户数据包)

TCP协议

面向连接的协议。数据传输之前都要建立连接(三次挥手),数据传输结束都要释放连接(四次挥手);一条TCP连接只能有两个端点,端点是socket(结构 IP地址:端口号),并非主机或进程;可靠交付;全双工通信(一端既可以做发送方也可以做接收方);面向字节流。

为何TCP是可靠的

TCP依赖停止等待协议和连续ARQ 协议+滑动窗口协议才达到可靠的目的

等待协议

  • 特点:资源利用率非常低

  • 工作原理:客户发送一次数据到服务端,必须等到服务端响应后才发第二次数据,中间的等待时间RTT占了大部分时间,中间如果出现差错(超时或确认丢失)都需要从新传输。

连续ARQ协议

  • 连续ARQ协议工作原理:维持一个发送窗口(记录了当前可以发送的数据包数量n),在窗口内的数据都可以连续发送出去,服务器只在接收完一个发送窗口的数据后才回响应(累计确认),发送端接收到响应就把发送窗口移动n位,开始新一轮数据发送。

TCP报文段的首部格式

虽然说TCP是面向字节流的,但是TCP传输的数据单元却是报文段,报文段由首部和数据两部分组成,如图:

1.源端口和目标端口(各占两字节)

2.序号(占4字节):TCP连接传输的数据每一个字节都有一个序号,而一个报文段可能会有多个字节的数据,这个序号指的是TCP报文段中起始的序号,下一个报文段的序号则是该序号加上报文数据长度(三次握手和四次挥手时说的SYN或ACK会消耗一个序号就是指该序号)

3.确认号(占4字节):因为一次数据传输会分成多个报文段,接收方接收完一次报文段后如果要发送确认(有可能不用确认,因为是接收完发送窗口的报文段才确认的),则会携带一个确认号,表示接收方想要接收的下一个报文的序号

4.数据偏移(占4字位):数据部分的起始位置离报文段起始位置的距离,就是报文首部的长度,单位是4字节,所以4位能表示最大值是十进制的15,就是15 x 4字节 = 60字节,TCP报文首部最大长度为60字节

5.保留(占6位):未被使用,全置为0

6.紧急URG:当URG=1时紧急数据才有效。注意,这里URG并不是紧急数据,只是一个标志,标志着紧急数据是否有效

7.确认ACK:当ACK=1时确认号才有效,当建立连接后全部传输的报文都要把ACK设置为1

8.推送PSH:接收方机器会有一个接收,当接收缓存慢了才回把接收到的数据交付到接收应用进程中,而如果发送端把报文的PSH设为1,接收方接收到该报文会立即交付到应用的进程中

9.复位RST:两个作用,1、当RST=1时,表示TCP连接中出现严重差错,必须释放连接,然后重新建立运输连接。2、当RST=1时,拒绝一个非法的报文段或拒绝打开一个连接。

10.同步SYN:用于同步序号(告诉另外一方,他们之间从该序号开始传输报文段),当SYN=1,ACK=0表示这时一个连接请求报文。

11.终止FIN:用于释放一个连接。当FIN=1时,表明此报文的发送方的数据已经发送完毕,并要求释放运输连接。

12.窗口(占2字节),是一个接收窗口,接收方允许发送方发送的数据量

13.检验和(占2字节):检验接收过来的报文段(报文首部和用户数据)是否有误

14.紧急指针(占2字节):当URG=1时才有效,指出紧急数据未尾位置(开始位置是整个报文段中用户数据的开头)

15.选项,长度可变,最长40字节

TCP可靠传输的实现

通过滑动窗口来发送数据

  • 发送窗口有两部分组成,已发送的报文段 和 能够发送但未发送的报文段(等待已发送报文段全部接收完发回来的确认就可以发送了)

  • 当收到确认后发送窗口会向右移动到7位置,作为窗口的起始位置。

  • 发送窗口,发送窗口有可能会收缩(因为接收窗口有可能因为接收缓存不够而变小)

超时重传时间的选择

采用一个根据RTT动态计算的时间,并不是直接采用一个固定的时间

RTT:发送一个报文段到收到对应的ACK所花费的时间

RTO:超时重传时间

RTTs是一个加权平均RTT时间

RTTd是RTTs偏差的加权平均

RTO = RTTs + 4 * RTTd

如果发生了重传 ,这次的RTT会让RTTs会变大,此时是不会用该RTT来计算RTTs的

确认SACK

是一个TCP报文首部的选项。

当数据传输过程中,接收方可能会未按顺收到部分报文段,此时序号告诉发送方从新传输这些报文段,SACK选项就是用于告诉发送方需要传输那些报文段的

TCP传输连接管理

连接的三个阶段:建立连接、数据传输、连接释放

在建立连接的过程中要解决三个问题:使每一方都知道对方的存在、协商一些参数、能够运输实体资源。主动建立连接的一端叫客户端,被动等待连接建立的一方叫服务器

连接建立(三次握手)

如图:

每次发送一个seq时,都会消耗一个序号,所以会发现在确认时,ack总等于另一端请求的seq+1

为何需要第三次握手?

假设没有第三次握手(即A再次确认)

在很久很久以前,A发了一个连接请求给B,但是网络滞留的原因,请求没有到达B,所以B也没有确认返回给A,所以A右发送了一个连接请求给B,此时B收到了连接请求并返回了一个确认给A,此时连端开始愉快的数据传输之旅。当传输结束时,分别断开连接,各自干各自的活儿。但是过了一段时间,之间滞留在网络中的A发出的连接请求到达了B中,B以为A又要传输数据,便右回了一个确认给A,但是A并不需要输出传输,也没有理会这个确认,而B却在傻傻等待A传输数据,这个就会浪费B的资源。

但是如果有第三次A的确认,A这个滞留的连接传给B,B返回一个确认,但是A不想传输数据了,便没有回一个确认给B(第三次握手),B没有收到该确认也不会等待A传输数据。

连接释放(四次挥手)

如图:

第一次挥手:客户端发送连接,FIN=1标志着A已经完成了数据的发送。

第二次挥手:B回了一个确认,此时A与B的发送连接就断开了。

第三次挥手:因为TCP连接是全双工通信的,B还保留着一个对A大发送连接,如果等到B也不需要发送数据给A时,B会发送一个连接给A,seq等于一个大于或等于v的值(因为A与B断开发送连接到B与A断开发送连接期间有可能B向A发送了数据,就是消耗序号)。

第四次挥手:当A收到B的连接时,要回一个响应给B,但是此时会有一个2MSL长的等待时间,时间一过,就真正的断开与B的全部连接了。

为什么需要2MSL的等待时间?

MSL:最长报文寿命

当A发送确认给A后,如果此时出现了一些状况(连接被丢弃等),确认无法到达B中,B会重新发送一个连接给A,但是A就停止了,B就一直等待(其实有一个保活时间)。

如果有了这个等待时间,就算A的ACK确认丢失了,B也会再从新发送一个连接给A,A接收到该连接后,会从新计算等待时间。A会再确认一次

会话层(Session)

封装调用TCP。会话层建立和管理应用程序之间的通信,封装了调用TCP去打包,然后调用IP协议去找路由等操作。

Socket

TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。  UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。 TCP/IP协议族包括运输层、网络层、链路层

Socket一般指套接字,所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象,一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

客户端基本的流程:

  • 创建Socket(socket)
  • 和服务器建立连接(connect)
  • 向服务器发送请求(write)
  • 接受服务器端的数据(read)
  • 关闭连接(close)

服务器端基本的流程:

  • 创建Socket(socket)
  • 绑定端口(bind)
  • 监听端口(listen)
  • 等待客户端请求(客户端没有请求时阻塞)(accept)
  • 接受客户端请求(read)
  • 向客户端发送数据(write)
  • 关闭socket(close)

表示层(Presentation)

解决不同系统之间的通信语法问题(数据格式化,代码转换,数据加密)。用Linux系统给window系统发包,两个系统语法不一致,就像安装包一样,exe是不能在linux下用的,shell在window下不能直接运行。表示层(presentation)解决不同系统之间的通信语法问题。

应用层(Application)

这一层规定应用程序的数据格式(文件传输,电子邮件,文件服务,虚拟终端)。TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”

Telnet协议(teletype network)

Telnet是位于OSI模型的第7层,应用层上的一种协议,提供连接到远程主机的TCP/IP协议,是Internet远程登录服务的标准协议和主要方式。

安装telnet客户端

在控制面板--程序下点击启用或关闭widows功能,在弹出的页面中找到Telnet Client 勾选上 然后点击确定如下: 

 

客户端安装好 按下键盘的 win+R 组合快捷键,然后在打开的 运行 窗口中输入 cmd 回车,然后在打开的dos命令行窗口中输入 telnet 远程ip port 就可以连接远程服务器了。当出现telnet: connect to address 192.168.150.168: Connection refused时,有两种情况一个可能是网络不通,可使用ping检测,如果ping的网络通,可能对方服务器没有启动对应的服务。退出需要按快捷键ctrl+],然后输入quit命令或者q命令,回车后即可退出。

查看本机的开放端口,显示协议统计和当前的 TCP/IP 网络连接

使用Windows自带的 “netstat“ 命令来查看系统开放的端口, -a 表示显示所有连接和检测端口 , -n ”表示以数字格式来显示地址和端口号。操作流程:快捷键Win + R 然后输入cmd 然后输入netstat -an 命令 

从上面的列表可以看到135、445、4303等端口一直在监听着,暂时没有应用程序的PID。 

DNS协议

DNS协议位于OSI模型的应用层。运行在用户主机上的某些应用程序需要将主机名转换为IP地址。这些应用程序将调用DNS的客户机端,并指明需要被转换的主机名。用户主机的DNS客户端接收到后,通过应用层向网络中发送DNS查询报文。所有DNS请求和回答报文使用的UDP数据报经过端口53发送。

DNS域名解析

DNS的作用

在互联网中其实没有类似于www.xxx这种域名方式,是用IP地址表示的,例如:222.222.222.222,在浏览器地址栏里输入222.222.222.222才能打开网站www.xxx,互联网上的网站成千上万,如果每个网站登陆都需要记住一大串数字,特别不方便。DNS的出现将222.222.222.222解析为www.xxx,访问的时候直接输入域名就可以了。

为什么一定要设置DNS才能上网?有些时候电脑能登陆QQ、MSN,但却打不开网页呢?其实大部分原因都是因为DNS服务器故障造成的,DNS服务器地址是唯一的,是运营商提供给终端用户用来解析IP地址及域名的关系,如果不设定DNS服务器地址,那么就无法查询地址的去向,自然也就打不开网页,而QQ、MSN等即时聊天软件,采用的是UDP传输协议,即不可靠传输协议,无需提供DNS服务器地址,也同样可以登陆。

DNS两种查询方式

递归

主机向本地域名服务器的查询一般都是采用递归查询。
如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。
因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。

迭代

本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。下图给出了这两种查询的差别:

整个查询过程:

两个主机m.xyz和y.abc,主机m.xyz要发送邮件给主机y.abc,这时就必须知道主机y.abc的IP地址。dns进行流程如下:

    1、主机m.abc先向本地服务器dns.xyz进行递归查询。

    2、本地服务器采用迭代查询。它先向一个根域名服务器查询。

    3、根域名服务器告诉本地服务器,下一次应查询的顶级域名服务器dns的IP地址。

    4、本地域名服务器向顶级域名服务器dns进行查询。

    5、顶级域名服务器dns告诉本地域名服务器,下一步应查询的权限服务器dns.abc的IP地址。

    6、本地域名服务器向权限域名服务器dns.abc进行查询。

    7、权限域名服务器dns.abc告诉本地域名服务器,所查询的主机的IP地址。

    8、本地域名服务器最后把查询结果告诉m.xyz。

整个查询过程共用到了8个UDP报文。为了提高DNS查询效率,并减轻服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。

在上面的查询过程中,如果在m.xyz的主机上不久前已经有用户查询过y.abc的IP地址,那么本地域名服务器就不必向根域名服务器重新查询y.abc的IP地址,而是直接把告诉缓存中存放的上次查询结果(即y.abc的IP地址)告诉用户。

由于名字到地址的绑定并不经常改变,为保持告诉缓存中的内容正确,域名服务器应为每项内容设置计时器并处理超过合理时间的项(例如每个项目两天)。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理该项的域名服务器绑定信息。当权限服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名解析的正确性。

不仅在本地域名服务器中需要高速缓存,在主机中也需要。许多主机在启动时从本地服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机应当定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删除无效的项。由于域名改动并不频繁,大多数网点不需花精力就能维护数据库的一致性。

DNS解析流程举例

如上图所示,DNS解析流程:

1、首先客户端位置是一台电脑或手机,在打开浏览器以后,比如输入http://www.zdns的域名,它首先是由浏览器发起一个DNS解析请求,
如果本地缓存服务器中找不到结果,则首先会向根服务器查询,根服务器里面记录的都是各个顶级域所在的服务器的位置,当向根请求http://www.zdns的时候,
根服务器就会返回服务器的位置信息。

2、递归服务器拿到的权威服务器地址以后,就会寻问cn的权威服务器,知不知道http://www.zdns的位置。这个时候cn权威服务器查找并返回http://zdns服务器的地址。

3、继续向http://zdns的权威服务器去查询这个地址,由http://zdns的服务器给出了地址:202.173.11.10

4、最终才能进行http的链接,顺利访问网站。

5、这里补充说明,一旦递归服务器拿到解析记录以后,就会在本地进行缓存,如果下次客户端再请求本地的递归域名服务器相同域名的时候,就不会再这样一层一层查了,
因为本地服务器里面已经有缓存了,这个时候就直接把http://www.zdns的A记录返回给客户端就可以了。

DNS查询类型

DNS的查询类型有20种,比较常用的查询类型有有A,NS,CNAME,PTR,MX等五种类型。以下分别介绍五种类型:

1)A:由DNS域名到IP地址的查询,即正向查询,编程中由函数gethostbyname实现。

2)PTR:由IP到域名的查询,即逆向查询,编程中由函数gethostbyaddr。

3)NS:查询解析的名字服务器(Name server)。

4)CNAME:查询DNS的别名。

5)MX:邮箱服务器查询。

记录一条域名信息映射关系,称之为资源记录(RR)。当我们查询域名http://www.zdns的时候,查询结果得到的资源记录结构体中有如下数据:

1、TTL,就是生存周期,是递归服务器会在缓存中保存该资源记录的时长。

2、网络/协议类型,它的代表的标识是IN,IN就是internet,目前DNS系统主要支持的协议是IN。

3、type,就是资源记录类型,一般的网站都是都是A记录(IPv4的主机地址)。

4、rdata是资源记录数据,就是域名关联的信息数据。

DNS缓存
DNS缓存指DNS返回了正确的IP之后,系统就会将这个结果临时储存起来。并且它会为缓存设定一个失效时间 (例如N小时),在这N小时之内,当你再次访问这个网站时,系统就会直接从你电脑本地的DNS缓存中把结果交还给你,而不必再去询问DNS服务器,变相“加速”了网址的解析。

当然,在超过N小时之后,系统会自动再次去询问DNS服务器获得新的结果。所以,当你修改了 DNS 服务器,并且不希望电脑继续使用之前的DNS缓存时,就需要手动去清除本地的缓存了。

DNS缓存分类

1)浏览器DNS缓存(内存中): 浏览器会按照一定频率缓存DNS记录

2)本地操作系统DNS缓存(内存中): 如果浏览器缓存中找不到需要的DNS记录,那就去操作系统找。

3)本地HOSTS文件(硬盘中): Windows系统中位于C:\Windows\System32\drivers\etc

4)路由器指定的DNS(远程): 路由器自动获取DNS地址,也可以手动修改-登录后台设置DNS服务器地址
  ps:路由器DNS被篡改会造成域名劫持,你访问的网址都会被定位到同一个位置,但是IP直接可以访问

5)ISP的DNS服务器(远程): ISP(Internet Service Provider互联网服务提供商、联通电信移动),ISP有专门的DNS服务器应 对DNS查询请求

6)根服务器(远程,跨国): ISP的DNS服务器还找不到的话,它就会向根服务器发出查询请求
复制代码

调用系统缓存需要跨进程,消耗大,因此为了解析速度的方便,就有了一系列缓存来加快IP查找速度。

浏览器DNS查找顺序
浏览器DNS缓存->本地系统DNS缓存->本地计算机HOSTS文件->ISP DNS缓存->递归or迭代搜索

期间如果查询到了,也就直接访问ip地址了,这个就像三级缓存原理一样,例如,能够在hosts文件中找到就不会再去查其他的

清除DNS缓存
打开cmd执行命令:ipconfig /all

全国通用DNS地址(国内用户推荐使用,速度较快!)
首先DNS服务器地址添:114.114.114.114
备用DNS服务器地址添:114.114.115.115
全球通用DNS地址(此DNS地址为谷歌服务器的)
首选DNS服务器地址添:8.8.8.8
备用DNS服务器地址添:8.8.4.4

查看本地dns缓存命令:ipconfig /displaydns

清除本地dns缓存命令:ipconfig /flushdns

清除浏览器缓存:

在开发的时候有时会给某个域名绑hosts,用于本地开发测试,但是绑了之后,用谷歌浏览器访问会发现并没有生效,按F12会发现访问的还是线上的ip,
说明浏览器是有该域名的dns缓存的,那么如何清除浏览器的dns缓存呢?

1、针对谷歌浏览器

谷歌浏览器清除方法如下:打开浏览器,访问如下地址
chrome://net-internals/#dns

点击 clear host cache,就清楚了浏览器的dns缓存,再访问绑hosts的域名,就会发现ip变啦

2、针对火狐浏览器

如果是firefox火狐浏览器的话,可以按照以下方式:

在地址栏中 about:config 并回车,可能会出现一个警告信息,直接点击按钮进入,会出现firefox的所有配置信息,通过搜索dns 进行过滤,
可以看到一项名为 network.dnsCacheExpirationGracePeriod 项,它对应的值就是DNS缓存的时间,双击此项,会出现修改的提示框,填入 0 (不缓存DNS)即可。

其他了解
13台根dns:

A.root-servers198.41.0.4美国

B.root-servers192.228.79.201美国(另支持IPv6)

C.root-servers192.33.4.12法国

D.root-servers128.8.10.90美国

E.root-servers192.203.230.10美国

F.root-servers192.5.5.241美国(另支持IPv6)

G.root-servers192.112.36.4美国

H.root-servers128.63.2.53美国(另支持IPv6)

I.root-servers192.36.148.17瑞典

J.root-servers192.58.128.30美国

K.root-servers193.0.14.129英国(另支持IPv6)

L.root-servers198.32.64.12美国

M.root-servers202.12.27.33日本(另支持IPv6)

域名定义:
http://jingyan.baidu/article/1974b289a649daf4b1f774cb.html

顶级域名:以,,,等等属于国际顶级域名,根据目前的国际互联网域名体系,国际顶级域名分为两类:类别顶级域名(gTLD)和地理顶级域名(ccTLD)两种。类别顶级域名是         以"COM"、"NET"、"ORG"、"BIZ"、"INFO"等结尾的域名,均由国外公司负责管理。地理顶级域名是以国家或地区代码为结尾的域名,如"CN"代表中国,"UK"代表英国。地理顶级域名一般由各个国家或地区负责管理。

二级域名:二级域名是以顶级域名为基础的地理域名,比喻中国的二级域有,,,,.gd等.子域名是其父域名的子域名,比喻父域名是abc,子域名就是www.abc或者.abc.
一般来说,二级域名是域名的一条记录,比如alidiedie是一个域名,www.alidiedie是其中比较常用的记录,一般默认是用这个,但是类似
.alidiedie的域名全部称作是alidiedie的二级

Http协议

Http协议的特点:支持客户端 / 服务器模式、简单快速、灵活(允许传输任意类型的数据对象)、无连接(在完成一次请求获得响应后就会断开)、无状态(没有记忆的 请求完一次后就结束了后面如果要再获得数据必须从新请求)。

请求报文的结构

请求头部:用于设置请求的的一些参数如:ContentType

请求空行:就算请求数据为空,都要有空行,表示请求首部的结束

从浏览器地址栏输入url,经历的流程:DNS解析、TCP连接、发送HTTP请求、服务器处理请求,并返回HTTP报文、浏览器解析渲染页面、连接结束

Get和Post

HTTP报文层面:GET请求信息放在URL中,POST放在报文体中

数据库层面:GET符合幂等性和安全性,POST不符合

其他层面:GET可以被缓存、储存,而POST不行

Cookie和Session

为什么会有这两种技术?

  • 在使用一些需要登录的网站时,每次访问,都会需要验证个人信息,即登录。这样做比较繁琐,能否将个人的账号和密码存起来,访问的时候直接用存取来的个人信息进行验证呢?解决这个问题的就是Cookie和Session

  • Cookie:通过客户端(浏览器)来缓存个人信息。当用户第一次登录时,服务器会将个人信息放在了响应中, 浏览器接收到响应时候会将个人信息以Cookie的形式在访问浏览器中保存起来,在下一次访问服务器的时候会带上该Cookie,Cookie中有个人信息,服务器能解析出来,所以不同再次登录验证了。(不够安全,对服务器的开销小)

  • Session通过服务端来缓存信息,根据请求中是否包含Session id的字段,如果不存在则创建一个,并返回给浏览器缓存起来。如果存在则通过该Session id在服务器存储中获得对应的Session信息,直接验证。(安全,服务器的开销变大)

Http与Https

1、HTTPS需要到CA申请证书,HTTP不需要

2、HTTPS密文传输、HTTP明文传输

3、连接方式不同,HTTPS默认使用443端口,HTTP使用80端口

4、HTTPS = HTTP + 加密+认证+完整性保护,较HTTP安全

其实也不一定就安全,原因是用户不会再访问时候加上http:// 或 https://, 浏览器就默认会加上http://,然后通过转发的方式转成https:// 这个过程http就有可能会被劫持了。

此时会用到一个技术 HSTS(HTTP Strict Transort Security)

网络通信的实现

实现网络通信,每台主机需具备四要素:本机的IP地址、子网掩码、网关的IP地址、DNS的IP地址。
获取这四要素分两种方式:静态获取 即手动配置 动态获取 通过dhcp获取

以太网头 ip头 udp头 dhcp数据包

(1)最前面的”以太网标头”,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。

(2)后面的”IP标头”,设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。

(3)最后的”UDP标头”,设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。

这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道”这个包是发给我的”,而其他计算机就可以丢弃这个包。

接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个”DHCP响应”数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。

新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数

网络通信流程


1.本机获取

本机的IP地址:192.168.1.100
子网掩码:255.255.255.0
网关的IP地址:192.168.1.1
DNS的IP地址:8.8.8.8
2.打开浏览器,想要访问Google,在地址栏输入了网址:www.google。

3.dns协议(基于udp协议)

4.HTTP部分的内容,类似于下面这样:

GET / HTTP/1.1
Host: www.google
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1) ……
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: … …

我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中。

5 TCP协议

TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。

TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。

6 IP协议

TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。

7 以太网协议

IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560。

8 服务器端响应

经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。

根据IP标头的序号,Google将四个包拼起来,取出完整的TCP数据包,然后读出里面的”HTTP请求”,接着做出”HTTP响应”,再用TCP协议发回来。本机收到HTTP响应以后,就可以将网页显示出来,完成一次网络通信。

更多推荐

计算机网络模型

本文发布于:2023-04-21 07:51:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/9574d49b5b5dc8dff7f9472cab585388.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:计算机网络   模型

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 92750文章数
  • 23607阅读数
  • 0评论数