计算机网络(二)
现在开始了人生中第一个项目,开始为这个项目做出准备了,根据学长的指示,深入了解一下计算机网络工作的原理。
计算机网络协议为什么要分层?
- 各层之间相互独立:高层是不需要知道底层的功能是采取硬件技术来实现的,它只需要知道通过与底层的接口就可以获得所需要的服务;
- 灵活性好:各层都可以采用最适当的技术来实现,例如某一层的实现技术发生了变化,用硬件代替了软件,只要这一层的功能与接口保持不变,实现技术的变化都并不会对其他各层以及整个系统的工作产生影响;
- 易于实现和标准化:由于采取了规范的层次结构去组织网络功能与协议,因此可以将计算机网络复杂的通信过程,划分为有序的连续动作与有序的交互过程,有利于将网络复杂的通信工作过程化解为一系列可以控制和实现的功能模块,使得复杂的计算机网络系统变得易于设计,实现和标准化。
IP数据报文
IP协议提供不可靠无连接的数据报传输服务,IP层提供的服务是通过IP层对数据报的封装与拆封来实现的。IP数据报的格式分为报头区和数据区两大部分,其中报头区是为了正确传输高层数据而加的各种控制信息,数据区包括高层协议需要传输的数据。
IPv4数据报如下图所示:
IP头部字段
第一个字段(只有四位)是版本字段。它包含IP数据报的版本号:IPv4为4,IPv6为6。IPv4和IPv6头部版本除版本字段位置相同外再无其它是一样的。因此,这两个协议不能直接相互操作,主机或者路由器必须分别处理IPv4和IPv6。
Internet头部长度(IHL)字段保存IPv4头部中32位字的数量,包括任何选项。由于它是一个4位的字段,所以IPv4的头部被限制为最多15个32位字,即60字节。IPv6中不存在这个字段,其头部的长度固定为40字节。
总长度字段是IPV4数据报的总长度,以字节为单位。通过这个字段长度和IHL我们就可以知道数据报的数据部分从哪里开始,以及它的长度。由于它是一个16位的字段,所以IPv4的数据报最大长度(包括头部)为65535字节。
标识字段帮助标识由IPv4主机发送的数据报。为了避免将一个数据报分片和其他数据报分片混淆,发送主机通常在每次发送数据报时都将一个内部计数器加一,并将该计数器值复制到IPv4标识字段。
生存期(TTL)字段用于设置一个数据报可经过的路由器数量上限。发送方将它初始化为某个值([RFC1122]建议为64,但128或255也不少见),每台路由器在转发该数据报时将该值减1。当这个字段值达到0时,该数据报被丢弃,并使用一个ICMP消息通知发送方。这可以防止由于出现不希望的路由环路而导致数据报在网络中永远循环。
IPv4头部中的协议字段包含一个数字,表示数据报有效载荷部分的数据类型。最常用的值为17(UDP)和6(TCP)。这提供了多路分解的功能,以便IP协议可用于携带多种协议类型的有效载荷。
头部校验和字段仅计算IPv4头部。理解这一点很重要,因为这意味着IP协议不会检查IPv4数据报有效载荷(例如TCP和UDP数据)的正确性。为了确保IP数据报的有效载荷部分已经正确传输,其它协议必须通过自己的数据完整性检验机制来检查重要数据。IPv6头部没有任何校验字段。
TCP/IP中的分解
访问一个网址的过程背后发生的那些事
1)回车键按下后,浏览器首先会对输入的地址数据进行解析
1.1、检查输入的URL是http协议,请求资源是对应主机名网站主页。
1.2、然后检查浏览器的严格安全传输列表( HSTS列表 ),如果网站在列表中,则浏览器直接使用https协议进行传输,否则直接使用http协议传输,或者先使用http协议向网站服务器发送一个请求,服务器返回浏览器只能以https协议进行,则接下来仍然只以https协议来进行传输。
1.3、然后检查输入地址中是否有非ASCII码的unicode字符,如果有的话进行字符转换。
1.4、当协议或主机名不合法时,浏览器会将地址栏中输入的内容传递给默认的搜索引擎。
2)然后进行DNS递归查询
2.1、DNS查询过程中,首先在缓存中进行查询,找到直接返回结果否则
2.2、再使用gethostbynme库函数进行查询,库函数查询过程中,首先到hosts中进行检查,查看域名是否在本地hosts文件中,找到直接返回结果,如果没有记录且库函数查询也没有记录则
2.3、以上查询均未果,则会向DNS服务器发送一条DNS查询请求。查询DNS服务器通常是在本地路由器或者ISP的缓存DNS服务器上进行,如果对应记录存在,则返回该映射地址,并且该地址会被标记为非权威服务器应答标签,如果对应记录不存在,则会递归向高层 DNS 服务器做查询,直到返回最终结果。
2.4、如果DNS查询失败,则返回无法解析DNS地址,停止,否则浏览器根据查询到的对应ip地址进行下一步操作,即使用套接字进行数据访问。
3)使用套接字进行数据访问
3.1、浏览器获得目标IP地址,以及URL中给出的端口号(http 协议默认端口号是 80, https 默认端口号是 443),调用系统库函数socket,请求一个TCP流套接字。
3.2、该请求首先被交给传输层,封装成TCP segment,然后被送往网络层,添加目标服务器IP地址以及本机的IP地址,封装成TCP packet,再接下来会进入链路层,在封包中加入frame头部,包含本机网卡的MAC地址和网关MAC地址等,形成最终的TCP封包。
3.3、TCP封包完成之后,会通过以太网等网络进行传输到目标地址。
4)建立TCP连接
建立TCP连接会进行三次握手的过程,然后进行发送HTTP请求过程和接收过程。
4.1、进行三次握手,首先向服务器发送一个syn报文,其中syn=1,seq number=1022(随机);
4.2、服务器接收到syn报文,根据syn=1判断客户端请求建立连接,并返回一个syn报文,为第一次握手,其中ack number=1023(客户端seq number+1),seq number=2032(随机),syn=1,ack=1;
4.3、客户端根据服务器的syn报文,确认其ack number是否与上一次发送的seq number+1相等,且ack=1,确认正确,则回应一个ack报文,为第二次握手,即ack number=2033(服务器seq number+1),ack=1,
4.4、服务器根据接收到的ack报文,确认ack number是否与上一次发送的seq number+1相等,并且ack=1,确认正确,则建立连接,进入Established状态,为第三次握手。
4.5、建立TCP连接后,会使用HTTP协议发送HTTP的GET请求,服务器处理请求返回资源数据。
5)浏览器处理数据
5.1、再接收到所请求的资源之后,浏览器会对接收到的html、css、js等数据根据标准格式进行解析。
5.2、然后会通过构建和遍历DOM节点树,进行各个节点的渲染计算,最后进行GPU的渲染布局和绘制步骤等。