应用层服务于用户,比如说我们在电脑上使用的软件,都是在应用层上实现的,当不同设备通信时,数据由下一层的传输层实现。应用层提供的功能比如HTTP、FTP、Telnet、DNS、SMTP等。应用层是工作在操作系统中的用户态,传输层以及下层模型工作在内核态。
传输层主要作用是给应用层提供网络支持,主要服务于应用层,作为数据传输媒介,实现应用与应用之间的通信。
传输层有两个传输协议:TCP与UDP
大部分应用都采用的TCP传输协议,比如说HTTP应用层协议。TCP与UDP相比多了很多特性,比如流量控制,拥塞控制,超时重传,这些特性都是为了保证数据包可以可靠的传输给对方。
UDP只负责传输数据包,不保证数据包是否丢失,实时性更好些,传输效率也更高。
应用传输的数据过大时(超过MSS),传输层会将数据包分块,当有分块丢失时,只需要重传丢失的分块即可,不需要重写发送整个数据包。在TCP协议中,这些分块叫做TCP段。
设备作为接收方时,传输层是要将数据包传输给应用层的。但是同一时间可能有多个应用在收发数据,为了避免数据传给应用时传输错误,通常会使用一个编号将应用区分开来,这个编号叫端口。
一些应用的端口是默认的,比如说80的Web服务器端口,22的远程登陆服务器端口,浏览器每一个独立的标签页都是一个独立的进程,操作系统会为这些页面分配独立的端口号,而不是给浏览器应用一个端口。
具体的传输实现,是由网络层实现的。
网络层常用的协议为IP协议,IP协议会将传输层的报文(HTTP与TCP报文)作为数据部分再次封装,加入IP包头组装成IP报文,与传输层相同的是,如果IP报文过大(超过MTU),那么也会进行分片传输,从而得到一个一个即将发送到网络的报文。
网络层是将数据从一台设备发送到另一台设备,为了找到接收数据的设备,我们需要一个与传输层中的端口类似的编号,在网络层这个编号叫做IP地址。
这里以IPv4协议举例,IP地址一共32位,分为4段,每段以.
进行分割,比如说192.168.100.1,每段占8位。
通过IP地址我们可以进行设备区分,但是网络层是如何进行寻址呢?
因此,IP地址可分为两种意义:
IP地址配合子网掩码来计算网络号与主机号。
在说如何计算网络号与主机号之前,先来了解一下子网掩码。比如说,10.100.122.0/24,IP地址后面的/24
代表子网掩码1的个数。也就是 [11111111-11111111-11111111-00000000]
,转换为十进制子网掩码就是255.255.255.0
了解子网掩码是什么之后,再来看如何计算网络号与主机号。将IP地址与子网掩码进行按位与运算得到网络号。将子网掩码取反后与IP地址进行按位与运算,就可以得到主机号。
网络层在寻址过程中,先去匹配相同的网络号(找到同一个子网),然后再去找主机。
IP协议处理方便寻址,还有一个重要作用是路由,在实际中,两台设备并不是使用一个网线连接的,而是通过网关,路由器,交换机等设备连接起来的,那么就会形成很多条网络路径,当数据包到达一个网络节点之后,就需要通过路由算法决定下一步走哪个网络路径。
IP协议中寻址是告诉我们应该去哪里,路由则是根据目的地选择路径。
为网络层提供链路级别传输的服务,负责在以太网、WiFi这样的底层网络上发送原始数据包,工作在网卡这个层次,使用Mac地址来标识网络上的设备。
生成IP报头之后,接下来要将数据传输给网络接口层,在IP报头之前再加上Mac报头,并封装成数据帧发送到网络上。
网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。