计网
TCP|UDP
TCP/IP即传输控制协议,是面向连接的协议,发送数据前要先建立连接,TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达。(类似于打电话)
UDP它是属于TCP/IP协议族中的一种。是无连接的协议,发送数据前不需要建立连接,是没有可靠性的协议。因为不需要建立连接所以可以在在网络上以任何可能的路径传输,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。(类似于发微信)

三次握手(建立TCP连接)
三次握手的具体细节:客户端向服务端发送SYN(Synchronization) -> 服务端返回SYN,ACK(Acknowledgement) -> 客户端发送ACK
三次握手的目的是建立可靠的通信信道,主要的目的就是双方确认自己与对方的发送与接收机能正常。
(大写的ACK、SYN等是状态码,ack、seq等才是存储信息)

客户端与服务器来回共发送三个TCP报文段来建立运输连接,三个TCP报文段分别为: (1)客户端A向服务器B发送的TCP请求报文段“SYN=1,seq=x”; (2)服务器B向客户端A发送的TCP确认报文段“SYN=1,ACK=1,seq=y,ack=x+1”; (3)客户端A向服务器B发送的TCP确认报文段“ACK=1,seq=x+1,ack=y+1”。
ACK:这里出现的ACK即为上面所说的TCP报文段首部中的“ACK字段”,置1时该报文段为确认报文段。 ack:而ack则为TCP报文段首部中“确认号字段”的具体数值。ack=x+1说明B希望A下次发来的报文段的第一个数据字节为序号=x+1的字节;ack=y+1说明A希望B下次发来的报文段的第一个数据字节为序号=y+1的字节。
第一次握手:客户什么都不能确认;服务器确认了对方发送正常 第二次握手:客户确认了:自己发送、接收正常,对方发送、接收正常;服务器确认 了:自己接收正常,对方发送正常 第三次握手:客户确认了:自己发送、接收正常,对方发送、接收正常;服务器确认 了:自己发送、接收正常,对方发送接收正常 所以三次握手就能确认双发收发功能都正常,缺一不可。
如果已经建立了连接,但客户端出现了故障怎么办?
保活计时器:用来防止在TCP连接出现长时期的空闲。服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为2小时,若服务器过了2小时还没有收到客户的信息,它就发送探测报文段。若发送了10个探测报文段(每一个相隔75秒)还没有响应,就假定客户出了故障,因而就终止该连接。
四次挥手(释放TCP链接)

客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗ *∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
常见面试题
为什么客户端最后还要等待2MSL?
MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。
保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
Cookie 、 Session、JWT
HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。
Session
客户端第一次向服务端发送请求,服务端会为这次请求创建 Session 对象,该对象存储了用户的相关信息,存储结构为 ConcurrentHashMap。同时生成一个 sessionId ,并通过响应头的 **Set-Cookie:JSESSIONID=XXXXXXX **命令,向客户端发送要求设置 Cookie 的响应; 客户端收到响应后,在本机客户端设置了一个 **JSESSIONID **的 Cookie 信息,该 Cookie 会随着浏览器的关闭而丢失。
客户端之后每次向服务端发送请求时,请求头都会带上该 Cookie信息(包含 sessionId ), 然后服务器通过读取请求头中的 Cookie 信息,获取名称为 JSESSIONID 的值,得到此次请求的 sessionId。
缺点:
A 服务器存储了 Session,就是做了负载均衡后,假如一段时间内 A 的访问量激增,会转发到 B 进行访问,但是 B 服务器并没有存储 A 的 Session,会导致 Session 的失效。
Cookie
对于Cookie来说,它是HTTP报文header头部中非常重要的一个属性,是浏览器提供给网页访问本地数据用的
Cookie是浏览器提供的持久化存储数据的机制
Session Cookies
Cookie不包含
有效期,会话 Cookie 存储在内存中,永远不会写入磁盘,当浏览器关闭时,此后 Cookie 将永久丢失。Persistent Cookies
Cookie 包含
有效期,它不会在客户端关闭时过期,而是**指定日期(Expires)或特定时间长度(Max-Age)**外过期,Cookie 将从磁盘中删除。JWTtodo
DNSDNS(域名系统)是一种分布式数据库系统,它将域名与 IP 地址映射信息存储在分布式的 DNS 服务器集群中。
这些 DNS 服务器按照层次结构进行组织,
顶层是根域名服务器,
其下是顶级域名服务器,
接着是权威域名服务器和本地 DNS 缓存服务器。
用户的计算机通过 DNS 查找功能查找域名时,首先会向本地 DNS 缓存服务器请求,如果本地 DNS 缓存服务器没有相应的记录,则会向根域名服务器请求,根域名服务器会告诉本地 DNS 缓存服务器顶级域名服务器的 IP 地址,本地 DNS 缓存服务器再向顶级域名服务器请求相应的权威域名服务器 IP 地址信息,接着向权威域名服务器查询域名与 IP 地址的映射关系。查询结果会被存储在本地 DNS 缓存服务器中,用户的计算机在之后访问相同的域名时,就可以直接从本地 DNS 缓存服务器中获取解析结果,而不需要再次进行域名解析。
这种分布式的 DNS 系统可以保证全球不同地区、不同的互联网服务提供商以及不同的机构或企事业单位都可以使用到,因为每个 ISP 都会部署自己的 DNS 服务器集群,这些 DNS 服务器集群之间可以相互协作,以保证全球互联网用户可以访问到所有的域名和主机名。此外,确保 DNS 的正常运行是互联网的基础服务之一,因此由各个组织和企业管理的 DNS 服务器都会进行负载均衡和故障容错等措施,以确保其高可用性和稳定性。
ISPISP是Internet Service Provider的缩写,即Internet服务供应商。
如同用户安装一部电话要找电信局一样,用户如果要接入Internet,则要去找ISP。ISP是用户接入Internet的入口。
通常,个人用户的计算机或集团用户的计算机网络先通过某种通信线路连接到ISP的主机,再通过ISP的连接通道接入Internet。
ISP的作用主要有两方面:
1、是为用户提供Internet接入服务;
2、是为用户提供各类信息服务,如电子邮件服务,信息发布代理服务等。用户可以根据ISP所提供的网络带宽、入网方式、服务项目、收费标准以及管理措施等选择适合自己的ISP。
交换机交换方式
我们都知道OSI七层模型中,从低到高有这样7层:
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
而交换机就是在数据链路层上工作的,他的作用是在主机节点之间传输数据的时候提供一个方式——交换
交换机在工作的时候有三种交换方式——电路交换、报文交换、分组交换
电路交换:

优点:
延迟小:由于是直连,通信的时候延迟很小
有序传输:看的出来电路交换是类似于Redis执行命令那样,是个单线程
没有冲突:理由跟第二条差不多
适用范围广、
实时性强:得益于第一条
控制简单
缺点:
建立连接时间长
线路独占,利用率较低
灵活性较差
难以规格化
报文交换:

优点:
不需要建立连接:类似于UDP
动态分配线路:交换机看到哪条链路有空就会将数据转发到这条链路
线路可靠性
线路利用率
提供多目标服务:相比于电路交换而言
缺点:
转发延时:毕竟每个报文在交换机上会有存储转发
需要较大的存储换缓存
需要传输额外的信息量:因为每个报文都需要携带头部信息或者其他信息
分组交换:

优点:
无需建立连接
线路利用率搞
简化了存储管理:分组交换吧报文按照规格划分成相同大小的分组,利于管理
加速传输:类似于操作系统中的流水线(具体搞忘了),充分利用线路
减少出错概率和重发数据量
缺点:
转发时延
需要传输额外的信息量
计算机网络体系结构分层
为什么这样分
在原理体系结构中,计算机网络体系被分为这样五层:
应用层
运输层
网络层
数据链路层
物理层
“每个人都有自己的事干”
应用层:解决应用程序之间的交互带来的网络问题
运输层:解决进程之间基于网络的通信问题
如何解决进程之间的网络通信问题
如何解决数据在传输的时候丢包之类的问题
网络层:解决分组在多个网络上的数据传输问题
如何识别网络或网络之间各主机(网络和主机共同编址的问题,例如IP地址)
路由如何转发,如何进行路由徐哲
数据链路层:解决分组在一个网络上的数据传输问题
如何表示网络中的个主机(主机编址问题,例如MAC地址)
如何从信号锁表示的一连串数据流中区分出地址和数据
如何协调主机间竞争总线
物理层:解决使用什么材料什么信号来传比特的问题
采用什么样的传输媒体
使用怎么样的信号表示01
采用怎样的物理接口
TCP/IP协议族
各层使用到的协议:

如何处理请求
浏览器发送一个http请求
到了应用层,会构建出一个http请求报文:

然后传输到运输层,运输层会添加一个tcp报文段:主要是为了区分应用进程,实现可靠传输

在逐层向下传输,添加对应的报文:
ip数据报:使报文可以被路由器转发

头尾部帧:
头部:使报文在网路上传输
尾部:检查收到的帧是否有误码

到了物理层的时候,物理层将报文转为01比特流并加上前导码:

比特流通过路由器,路由器在这里就做一个转发的作用:

将报文(比特流)传输到目标服务器时,按照原路解包,将http请求报文传输给应用层,经过后端逻辑处理过后,将http响应报文按照传输来的流程再发送回去
这就是浏览器发送http请求到收到响应的过程
物理层
物理层考虑的是怎么样才能将数据比特流从各种计算机之间传输,它为数据链路层屏蔽了各种传输媒体之间的差异,使得数据链路层是需要专注本层的协议和服务,不需要考虑由不同传输媒体带来的差异。
传输方式
按照串并行划分有:串行传授;并行传输
串行:计算机网络之间的数据传输方式是串行,保证其可靠性
并行:计算机内部数据传输方式是并行,数据在CPU与内存之间通过总线进行传输
按照同步异步划分:同步传输;异步传输
同步传输:分为外同步和内同步
外同步:在收发双方之间添加一条单独的时钟信号线。发送方和接收方需要在相同的时间间隔内发送和接收数据,这需要它们使用相同的时钟信号来同步它们的操作。如果没有时钟信号线,发送方和接收方可能会使用不同的时钟,这可能导致数据传输错误或失败。
内同步:发送端将时钟同步信号编码到发送数据中一起传输(曼切斯特编码)
异步传输:
字节之间的异步(字节之间的时间间隔不固定)
字节中的每个比特仍然要同步(各比特的持续时间是相同的)
按照信道数据量划分:单向通信;双向交替通信;双向同时通信
单项通信:广播收音机,只能广播传输收音机接收
双向交替通信:对讲机,可以双向但是不能同时
双向同时通信:打电话,可以双向可以同时
数据链路层
数据链路层的作用就是将层层封装的数据将其以帧的形式进行传输和处理
三个重要问题
封装成帧
封装成帧就是指的数据链路层将上层交付的协议数据单元添加帧头和帧尾使之成为帧
其中帧头和帧尾包含有重要的信息,且其作用之一是帧定界
以下是两种帧的帧结构:


在物理层在传输比特流的时候,接收方是通过帧定界标志来截取每个帧的,比如PPP帧下的比特流就是这样的结构:、

但是并不是所有帧结构都需要帧定界标志,比如Mac帧就不需要帧定界表示。
MAC帧通过物理层添加的前导码实现帧的划分:

透明传输
透明传输指的是数据链路层对上层交付过来的数据乜有任何限制,就好像不存在这一层一样
上面提到,划分每个帧的是通过帧定界标志划分的,那么会不会存在:在协议数据单元中出现帧定界符,让接收方提前截取一个不完整的帧呢?数据链路层肯定考虑过这个问题。
它的解决方案就是:类似于kotlin字符串的
"\$" -> "$"——转义符 的思想
先扫描上层传来的数据,扫描一下协议数据中有没有帧定界标志,如果有就在这之前进行填充:
面向字节的物理链路使用字节填充(字符填充)的方法实现透明传输
面向比特的物理链路使用比特填充的方法实现透明传输
差错检验
在实际的通信链路中都不是理想的,比特在传输的时候都可能产生差错:1->0;0->1
所以差错检验是数据链路层需要解决的重要问题之一
有两种方式来解决这一问题:奇偶差错检验;CRC冗余差错检验
奇偶差错检验:就是在待发送的数据后面添加1个奇偶检验位,接收方接收到过后判断奇偶。但是如果有偶数个问发生了误码,接收方就会误认为没有发成误码。故不适用
CRC冗余差错检验:就是双方约定好一个多项式,通过一定的计算方式来判断是否出现了误码
需要注意的是,差错检验只能检测出帧在传输的过程中出现了差错,不能定位这个错误以及纠错
可靠传输:
这里的可靠传输不单单针对的数据链路层来说,可以涵盖整个计算机网络体系
为了保证可靠的数据传输,衍生出了三种传输协议:
停止-等待协议SW
回退N帧协议GBN
选择重传协议SR
停止-等待协议
停止等待协议就是说,发送方发送数据给接收方,接收方收到数据过后,发一个ack返回给接收方,接收方才发送下一个分组数据
在传输期间出现丢包的情况,停止等待协议为其做了以下措施:
接收方检测到数据分组有误码的时候,将其丢弃并等待发送方的超时重传。但对于误码率高的点对点传输,为了尽早重传,可以给发送方发送NAK分组
为了使接收方能判断数据分组是否重复,需要给数据分组编号
超时计时器设置的超时时间一般选择:略大于**“从发送方到接收方的平往返时间”**
回退N帧协议
如果说停止等待协议是单信道阻塞利用的话,那么回退N帧协议就是单信道并发执行。
类似计算机系统当中的流水线
发送方会有一个发送窗口$ WT $,其取值范围为:( 1,2^n^ - 1 ]
为1的时候,就是停止等待协议
大于 2^n^ - 1 的时候,接收方无法分辨是新数据分组还是就数据分组
发送方发送窗口内某个已发送的数据分组产生超时重发的时候,其后续再发送窗口内已发送的数据分组也会受到影响,全部重新跟着重新发送——回退N帧协议
选择重传协议
相对于回退N帧协议,选择重传协议的不同,或者说是改进:就是接收方的接收窗口尺寸从1改进到了
为1的时候,就是停止等待协议
大于$ WT $的时候,无意义
接收方可以接收为按需到达但是没有误码且序号落在接收窗口内的数据分组
接收方只有在按序接收数据分组后,接收窗口才能向前相应滑动
MAC地址
在每个主机发送的帧中必须携带表示发送主机和接收主机的地址,这一种物理地址就是MAC地址
MAC地址一般被固化在网卡(网络适配器)的电可擦可编程只读存储器中
MAC地址的标识符结构入下:

网络层
网络层的主要任务就是实现网络互通,进而实现数据包在各个网络之间的传输
它主要是解决一下主要问题:
网络层想运输层提供可靠的/不可靠的连接服务
网络层的寻址问题
路由选择问题
两种服务
这里直接上表格:
虚电路服务 & 数据报服务的比较
思路
可靠通网络当由网络来保证
可靠的通信应当由主机来保证
连接的建立
必须建立网络层
不需要建立网络层
终点地址
仅在连接建立阶段使用
每个分组都有终点的地址
分组的转发
同一条虚电路的分组按照统一路由进行转发
每个分组可以走不同的路由
当节点出故障的时候
所有通过故障节点的虚电路不能工作
出故障的节点可能会丢失分组,一些路由可能会发生变化
分组的顺序
总是按发送顺序到达终点
到达终点的时候不一定按照顺序
服务质量保证
容易实现
不易实现
IPV4
结构入下:

只有ABC类地址可以分配给网络中的各个主机或者路由器接口
主机号全1不能分配:网络地址
主机号全0不能分配:广播地址
ABC类地址的使用方:
A类地址分配给规模特别大的网络使用,例如网络运营商、互联网的主干网络和超大型公司。
B类地址分配给一般的中型网络,通常用于节点比较多的网络/区域的网络。
C类地址分配给小型网络,如一般的局域网和校园网,它可连接的主机数量是最少的,采用把所属的用户分为若干的网段进行管理。
子网
子网的出现解决了以下痛点:
IPv4地址枯竭问题的方法
将网络划分为多个子网,可以更好地控制网络流量和访问权限
通过借取主机位的部分位,来划分网络中的不同子网
划分细节:
一般会给网络地址和子网掩码,首先看网络地址是属于哪一类网络:ABC哪一类,再看子网掩码的最后非满位的位,得到会向网络地址的主机位借取的位数。
比如某个网络的地址是218.75.230.0,使用子网掩码255.255.255.128进行子网划分。
可以看出这个网络是C类网络,子网掩码的最后位 128 的二进制是10000000,所以借主机位的1位当做子网号:

CIDR
CIDR——无分类域间路由选择
它消除了传统的ABC类地址,以及划分子网的概念(没错,老子上面记的一啪啦都给推翻了,淦)
它可以更加有效地分配IPV4的地址空间
CIDR使用"斜线记法",即在IPv4后面加上"/",来标记多少位是网络位,后面的都是主机位
IP数据报传输
IP数据报的传输主要分为两个方面:
主机发送IP数据报
路由器转发IP数据报
主机发送IP数据报
主机会判断目的主机是不是跟自己在同一个网络下:
如果在同一个网络下,就属于直接交付;
如果不在同一个网络下,就属于间接交付。需要先交给路由器,由路由器进行IP数据报的转发
这个判断的方式是:
将目标地址和主机的子网掩码进行与运算,得出的结果等于是主机的网络地址的话,说明找到了
路由器转发IP数据报
同样分为两个步骤:
检查IP数据报首部是否出错:
如果出错了,直接丢弃,并且告知源主机
如果没出错,放你一马
第二步骤是,根据IP数据报的目的地址在路由器的路由表中查找匹配的条目
如果找到了匹配的条目,就转发给条目中指示的下一跳
如果找不到,直接丢弃,并且告知源主机
路由选择协议
我们路由器的路由选择有两类:静态路由选择;动态路由选择
静态:由人工配置网络路由,默认路由,特定主机路由……小规模网络适用
动态:有路由器通过路由选择协议自动获取路由信息。大规模网络适用
这就引出了路由选择协议了
分为两大类:内部网关协议IGP;外部网关协议EGP

那么这个选择协议究竟是在哪个环节发挥作用呢?这就要看看数据包通过路由器的路由器处理的整个过程了

浅浅的解释一下:
数据包先从物理层->数据链路层->网络层,当到了路由器交换结构的时候,交换结构先看看有没有误码之类的异常,如果有,直接丢弃;如果无误,按照报头里面的目的地址,查找转发表进行转发。如果转发表里面找不到,就丢给路由选择处理机,由它来根据具体的路由选择协议进行路由表的更新
运输层
TCP的流量控制
一般来说,我们总是希望数据传输的越快越好。
但是如果传输方传输的过于快,接收方接收不赢,类似于短板效应,就会导致数据的丢失
所谓流量控制,就是让发送方的发送效率不要太快,要让接收方接收的了。类比于响应式编程里面的背压的概念
TCP协议的流量控制正是通过滑动窗口的机制实现的,可以很方便的在TCP连接上实现对放松放松的流量控制:
TCP接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小
TCP发送方接收到接收方的零窗口通知后,应启动持续计时器。持续计时器超时后,向接收方发送零窗口探测报文
怎样理解上面两句话
第一句话就是,发送方发送完发送窗口里面的数据过后,由接收方返回的累计确认里面的接收窗口大小来进行调整发送窗口的大小,即由接收方决定你发送方下一次发多少
第二句话也不♂理解,意思就是说,当发送方接收到接收方的确认里面说了不要再发数据了,那我就待命。但是如果有一刻,接收方,诶,饥渴了,想要接收数据了,向发送方发送一个请求包说我想要数据了,正巧这个数据包丢失了,就会造成:发送方老实的等你需要我,我发送数据;接收方饥渴的等你发送数据,死锁了。所以需要就是,当发送方收到不要发数据的信息过后,启动持续计时器,进行计时,持续计时器超时后,向接收方发送零窗口探测报文,问问你要不要数据
拥塞控制
与上面的流量控制不同,流量控制避免的是接收方被发送放一股脑的发送而导致的缓存被占满。
而拥塞控制是,避免发送方的数据填满整个网络
在网络出现拥堵的时候,如果继续发送大量数据包,可能会导致数据包延迟、丢失等,这个时候TCP就会重传数据,但是一旦重传就会导致网络的负担的更重,于是会导致更大的延迟以及更多丢包,这个情况就会进入恶心循环被不断的放大
拥塞控制主要是四个算法:
慢启动slow-start
拥塞避免congestion avoidance
快重传fast retransmit
快恢复fast recover
具体算法真的很难记,绕了我┭┮﹏┭┮
TCP可靠传输
以字节为单位的滑动窗口
发送方的发送窗口与接收方的接收窗口并不总是一致
TCP通信全双工
接收方的累计确认和稍待确认机制
访问一个URL的执行过程
一个老生常谈的面试题了
大致上来讲就是经历了以下过程:
客户端获取URL -> DNS解析 -> 建立TCP连接 -> 发送http请求 -> 服务器处理请求-> 返回报文 -> 服务器进行渲染 -> 断开TCP连接
DNS解析
DNS解析就是,当用户输入一个url,按下
enter,浏览器得到一个域名,对其进行解析得到ip地址的一个过程
客户端首先找浏览器自身缓存的DNS记录
如果浏览器缓存中没找到需要的记录;或者记录过期了就搜索hosts文件和操作系统缓存
如果hosts文件和操作系统缓存中没有找到需要的及记录;或记录已经过期,就向域名解析服务器发送解析请求
如果域名就系服务器也没有该域名的记录,就开始递归迭代解析
获取域名对应的IP后,一步一步向上返回,直到返回给浏览器
建立TCP连接
浏览器会选择一个大于1024的本机目标IP地址的80端口发起TCP连接请求,经过3次握手,建立TCP连接

①客户端:
应用层:获取URL,通过DNS解析获取IP,根据HTTP协议生成HTTP请求报文
传输层:根据TCP协议连接从客户端到服务器三次握手
网络层:根据IP协议(传输数据),ARP协议(获取MAC地址),OSPF协议(选择最优路径),搜索服务器地址,一边中转一边传输数据
②服务端:各层之间提供服务,传输数据
③客户端:等数据res响应回来过后,返回给浏览器进行渲染
发送http请求
它主要发生在客户端。发送HTTP请求的过程就是构建HTTP请求报文并通过TCP协议中发送到服务器指定端口。HTTP请求报文是有三个部分组成:
请求行
请求报头
请求正文
请求行的格式如下:
请求报头允许客户端向服务器传递请求的附加信息和客户端自身的信息
常见的请求报头有:
Accept
Accept-Charset
Accept-Encoding
Content-Type
Authorization
Cookie
User-Agent
请求正文当中当使用POST、PUT等方法的时候,通常需要客户端想服务器传递数据,这些数据就存储在请求正文中。在请求报头有一些与请求正文相关的信息。
浏览器渲染
浏览器是一个边解析边渲染的过程
首先浏览器解析HTML文件构建DOM树,然后解析CSS文件解析渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。
浏览器根据页面内容,生成
DOM Tree;根据CSS内容,生成CSS Rule Tree。调用JS执行引擎执行JS代码根据
DOM Tree和CSS Rule Tree生成Render Tree——呈现树根据呈现树渲染页面
Last updated