计算机网络-TCP/IP模型&HTTP
TCP/IP网络模型概述
应用层
我们能直接接触到的就是应用层,我们手机和电脑使用的应用软件都是在应用层实现的
应用层只需要专注于为用户提供应用功能,如HTTP、FTP、Telnet、DNS、SMTP等等
应⽤层是⼯作在操作系统中的⽤户态,传输层及以下则⼯作在内核态
传输层
传输层有两个协议,分别是TCP和UDP
TCP 的全称叫传输控制协议(Transmission Control Protocol),⼤部分应⽤使⽤的正是 TCP传输层协议,⽐如 HTTP 应⽤层协议。TCP 相⽐ UDP 多了很多特性,⽐如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠地传输给对⽅
UDP相对来讲就很简单,只负责发送数据包,不保证数据包是否能抵达对方,但是实时性更好,传输效率也更高。当然UDP也可以实现可靠传输,把TCP的特性在应用层上实现就可以
应用需要传输的数据可能会非常大,直接全部传输不是很好控制,因此当传输层的数据包大小超过MSS(TCP最大报文段长度),就要将数据包分块,这样即使在传输的过程中发生丢包,也只需要重新传输这一个分块,而不需要重新发送整个数据包,每个分块被称为一个TCP段
当设备作为接收⽅时,传输层则要负责把数据包传给应⽤,但是⼀台设备上可能会有很多应⽤在接收或者传输数据,因此需要⽤⼀个编号将应⽤区分开来,这个编号就是端⼝,传输层的报文中会携带端口号,因此接收方可以识别出该报文是发送给哪个应用的
网络层
传输层并不负责数据从一个设备传输到另一个设备上,实际场景中的⽹络环节是错综复杂的,中间有各种各样的线路和分叉路⼝,如果⼀个设备的数据要传输给另⼀个设备,就需要在各种各样的路径和节点进⾏选择,⽽传输层的设计理念是简单、⾼效、专注,如果传输层还负责这⼀块功能就有点违背设计原则了,也就是说,我们不希望传输层协议处理太多的事情,只需要服务好应用即可,传输层只作为应用间的数据传输媒介,帮助实现应用到应用的通信,实际传输功能交给网络层
⽹络层最常使⽤的是 IP 协议(Internet Protocol),IP 协议会将传输层的报⽂作为数据部分,再加上 IP 包头组装成 IP 报⽂,如果 IP 报⽂⼤⼩超过 MTU(以太⽹中⼀般为 1500 字节)就会再次进⾏分⽚,得到⼀个即将发送到⽹络的 IP 报⽂。
网络层负责将数据从一个设备传输到另一个设备,世界上那么多设备,如何快速找到对方呢?因此,网络层需要有区分设备的编号
我们一般用IP地址给设备进行编号,对于IPv4协议,IP地址共32位,分成四段(比如192.168.132.00),每段是8位,从0-255。但是只有单纯的IP地址虽然做到了区分设备,但是寻址起来特别麻烦,全世界那么多设备,不可能做到一个个设备去匹配的,因此,IP地址有以下两种意义:
- 一个是网络号,负责标识该IP地址是属于哪个子网的
- 一个是主机号,负责标识同一子网下的不同主机
怎么分的呢?这需要配合⼦⽹掩码才能算出IP地址的⽹络号和主机号。举个例⼦,⽐如 10.100.122.0/24,后⾯的/24表示就255.255.255.0 ⼦⽹掩码,255.255.255.0 ⼆进制是「11111111-11111111-11111111-00000000」,是 24 个1,为了简化⼦⽹掩码的表示,⽤/24代替255.255.255.0
知道了⼦⽹掩码,该怎么计算出⽹络地址和主机地址呢?
将10.100.122.2和255.255.255.0进行按位与运算,就可以得到网络号
将255.255.255.0取反后与IP地址进行按位与运算,就可以得到主机号
寻址过程中,先匹配到相同的网络号(表示要找到同一个子网),才会找到相应的主机
除了寻址能力,IP协议还有另一个重要的能力就是路由,实际场景中,两台设备并不是用一条网线连接起来的,而是通过很多网关、路由器、交换机等众多设备连接起来的,所以会形成很多条网络的路径,因此当数据包到达一个网络结点,就要通过路由算法决定下一步走哪条路径,路由器寻址工作中,就是要找到目标地址的子网,找到后进而把数据包转发给对应的网络内
所以,IP协议的寻址作用是告诉我们下一个目的地该朝哪个方向走,路由则是根据下一个目的地选择路径,寻址更像导航,路由更像操作方向盘
数据链路层
生成IP头部后,接下来要交给数据链路层在IP头部前面加上MAC头部,并封装成数据帧发送到网络上
IP头部中的接收方IP地址表示网络包的目的地,通过这个地址我们可以判断要将包发到哪里,但是在以太网的世界里,这个思路是行不通的
什么是以太网呢?电脑上的以太网接口,WiFi接口、以太网交换机、路由器上的千兆,万兆以太网口,还有网线,都是以太网的组成部分。以太网就是一种在局域网内,把附近的设备连接起来,使他们进行通讯的技术
以太网在判断网络包目的地时和IP的方式不同,因此必须采用相匹配的方式才能在以太网中将包发往目的地,而MAC头部就是干这个用的,所以,在以太网中进行通信要用到MAC地址
MAC 头部是以太⽹使⽤的头部,它包含了接收⽅和发送⽅的 MAC 地址等信息,我们可以通过 ARP 协议获取对⽅的 MAC 地址。所以说,⽹络接⼝层主要为⽹络层提供「链路级别」传输的服务,负责在以太⽹、WiFi 这样的底层⽹络上发送原始数据包,⼯作在⽹卡这个层次,使⽤ MAC 地址来标识⽹络上的设备。
数据包封装格式
数据链路层的传输单位是帧,IP层的传输单位是包,TCP层的传输单位是段,HTTP的传输单位是消息或者报文
HTTP协议作用过程
想必不少小伙伴都想知道当键入网址,到网页显示,期间发生了什么,这就和HTTP关系密切了,接下来我们将以下图较简单的网络拓扑模型作为例子,探究究竟发生了什么
浏览器做的第一步是解析URL,URL解析后,生成发送给Web服务器的请求信息,下图展示了URL中的各个元素的含义
当没有路径名时,代表访问根目录下设置的默认文件,即/index.html(自己搭过网站的肯定很清楚),这样就不会混乱了
对URL进行解析后,浏览器确定了Web服务器和文件名,接下来就是根据这些信息来生成HTTP请求消息
但是仅仅靠一个小小的HTTP数据包,如何在浩瀚的网络中找到自己的归宿呢?
真实地址查询-DNS
通过浏览器解析URL并生成HTTP消息后,需要委托操作系统将消息发给Web服务器,但是在发送之前,需要知道服务器域名对应的IP地址,如果不知道IP地址,则相关的HTTP消息不能正确到达对应的服务器,而这种专门保存Web服务器域名与IP的对应关系的,叫做DNS服务器
域名的层级关系
DNS中的域名是用句点来分隔的,比如www.baidu.com,这里的句点代表了不同层次之间的界限
在域名中,越靠右的位置表示其层级越高,域名的最后还有一个点,比如www.baidu.com.,这个点代表根域名,即.根域是在最顶层,它的下一层就是.com顶级域名,再下面是baidu.com。所以域名的层级关系类似于一个树状结构
根域的DNS服务器信息保存在互联网中的所有DNS服务器中,这样一来,任何DNS服务器就都可以找到并访问根域服务器。因此,客户端只要能够找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再一路顺藤摸瓜找到位于下层的某台目标DNS服务器
域名解析的工作流程
如下图所示,介绍相关迭代查询(现实生活中常用)
递归查询也有,但是很少,主要是递归查询是本地域名服务器不知道,然后向根域名询问,由根域名一步步去查询,最后给本地域名服务器返回对应的IP地址,这样容易造成根服务器使用频率过高,故在现实生活中不常用,主机向本地服务器查询用递归查询,本地服务器向根域名服务器查询使用迭代查询
但是并不会每一次都进行查询,不然所耗费的资源太多,浏览器会先看看自身有没有对这个域名的缓存,如果有,直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去hosts文件看,如果也没有,才会去问本地DNS服务器
协议栈
数据包找到目的地了,但是还是很迷茫,它接下来需要找谁帮忙呢?这个时候就要用到协议栈了
通过DNS获取IP后,就可以把HTTP的传输工作交给操作系统中的协议栈。协议栈的内部分为几个部分,分别承担不同的工作,上下关系具有一定的规则,上面的部分会向下面的部分委托工作,下面的部分收到委托工作并执行
应用程序通过调用Socket库,来委托协议栈工作,协议栈的上半部分有两块,分别是负责收发数据的TCP和UDP协议,这两个传输协议会接受应用层的委托执行收发数据的操作
协议栈的下面一半是用IP协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由IP负责的
其中IP中还包括ICMP协议和ARP协议:ICMP用于告知网络包传输过程中产生的错误以及各种控制信息;ARP用于根据IP地址查询相应的以太网MAC地址
IP下面的网卡驱动程序负责控制⽹卡硬件,⽽最下⾯的⽹卡则负责完成实际的收发操作,也就是对⽹线中的信号执⾏发送和接收操作
HTTP的传输需要那么多的协议协助,我们将一个个进行介绍