一、OSI七层模型和TCP/IP协议
详见我的相关文章【OSI七层模型和TCP/IP协议】。
二、TCP/IP五层模型
五层模型
OSI参考模型定义了七层,实际应用中可归为TCP/IP五层模型,分别运行在用户态和内核态:
- 用户态:即程序运行的用户空间,将应用层、表示层、会话层统一归为应用层;
- 内核态:即操作系统OS的内核空间,包含传输层、网络层、数据链路层、物理层。
客户端Client和服务端Server(如这里的Tomcat服务器)建立连接并进行Socket通信,需要基于OSI模型和TCP/IP协议的下一跳机制:
- 传输控制层:通过三次握手建立连接,传输数据;
- 网络层:路由和寻址,找到下一跳,即端点间通信,从源IP+PORT -> 目标IP+PORT;
- 数据链路层:进行节点间通信,即从源MAC地址 -> 目标MAC地址;
- 物理层:利用传输介质为数据链路层提供支持,实现相邻计算机节点间比特流的透明传递。
1、应用层
应用层使用的协议,包括HTTP、HTTPS、SSH等协议,常用的Tomcat、Nginx就运行在这一层。
2、传输控制层
1. 通过TCP协议建立连接
通过TCP协议建立的连接,是面向对象的可靠的连接方式,每一次接收方成功接收数据后,都会返回一个ACK确认。
三次握手
客户端和服务器建立Socket连接并进行通信,首先要进行三次握手:
- 第一次:客户端向服务端发送连接请求;
- 第二次:服务端收到请求后,会向客户端返回ACK确认;
- 第三次:客户端收到服务端ACK后,再次向服务端发送请求。第三次握手会黏连,客户端带着数据包+确认包,连接成功后,通知操作系统开辟资源,为之后的数据通信做准备。
四次分手
客户端和服务端需要断开连接时,需要经过四次分手:
- 两次请求,两次确认:客户端需要向服务端发送断开连接请求,并需要得到服务端的确认;同理服务端也需要向客户端回送断开连接请求,并得到客户端的确认;
- 断开连接,销毁资源:断开连接后,通知操作系统将之前分配的资源释放掉。
面向对象的最小连接
三次握手->数据传输->四次分手是最小的连接粒度,不可分割。
2. UDP协议
用户数据报协议(UDP,User Datagram Protocol),是Internet协议集支持的一个无连接的、不可靠的传输协议。即无需建立连接就可以发送封装的IP数据包。
3. Socket
套接字(Socket),就是网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。
简单理解,Socket就是IP+PORT(端口)。一台服务器的最大端口数量为 65535 个。
4. netstat命令
可以通过netstat
命令打印网络连接、路由表、接口统计信息、伪装连接和多播成员,使用最多的打印网络连接信息。
如上图中netstat -natp
可查看本机的网络连接信息,即本机IP+某一个端口,和远程的某个IP+端口建立的TCP连接信息。
该命令涉及到的参数含义:
- -n:拒绝显示别名,能显示数字的全部转化为数字;
- -a:all,显示所有选项,默认不显示LISTEN相关;
- -t:tcp,仅显示tcp相关选项;
- -p:显示建立相关连接的程序名。
3、网络层
1. 下一跳机制
- 每一个互联网设备内存不需要存储全网数据,只需要存储它周边一步之内的数据,就是和它在同一网络中的数据;
- TCP/IP协议就是基于下一跳机制;
- IP地址是端点间的,而MAC地址是节点间的。
2. 网络配置的四个维度
- IPADDR:IP地址(点分字节),表示每个网络地址ID号或者坐标;
- NETMASK:掩码,IP地址与掩码进行与(&)运算,得到IP+主机位;
- GATEWAY:网关,route路由表,下一跳地址,如192.168.150.2,代表非同一局域网,不是直连的,需要走路由。而如果是0.0.0.0的话,代表是同一局域网IP地址,可以直接通信,不需要走路由;
- DNS:域名服务器(Domain Name System),可以解析域名和IP地址的映射,全网的。
3. route命令
- 在网络中,
route
命令用来显示、添加、删除和修改网络的路由; - 通过
route -n
来以数字格式显示路由表。这将以IP地址和网络掩码的数字形式而非主机名和网络掩码的形式来显示路由表的内容。
通过IP地址(点分字节)与这里的掩码Genmask进行与运算,得到的值与Destination目标IP进行匹配,匹配成功则走对应网关Gateway路由成功,否则路由不通。
4、链路层
1. ARP
- ARP:地址解析协议(Address Resolution Protocol),在局域网中,是通过ARP协议来完成IP地址转换为第二层物理地址(MAC地址)的;
- ARP协议对网络安全具有极其重要的意义,通过伪造IP地址和MAC地址实现ARP欺骗(也叫MAC欺骗),能够在网络中产生大量的ARP通信量使网络阻塞;
- ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行;
- 每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的,通过
arp -na
命令可以查看,如上图所示。
2. 数据包
在网络层的下一跳IP包上一层,所以共有三层:
- 最外层:是MAC地址,即下一跳节点;
- 往里一层:是目标IP地址;
- 最里层:是端口号,通过端口号确定最终给哪个进程。
这就保证了在多设备传输过程中,只能改变其最外层的MAC地址,而不能改变最终目标的IP地址和端口号。
3. 三层寻址
通过3层完成寻址:
- 源端口号 -> 目标端口号;
- 源IP地址 -> 目标IP地址 – 端-端;
- 源MAC地址 -> 目标MAC地址 – 点-点。
4. 模拟链路层流程
前置条件
- 计算机1、计算机2同时连接一个交换机,想要上网就要再连接一个路由器。
- 网络号:192.168.1.0(0代表主机位),掩码255.255.255.0,其中的计算机IP地址可以1.1、1.2、1.3 等等;
- 计算机1的IP地址:192.168.1.4,MAC地址:1.1@mac;
- 路由器一般是3层(网络层、链路层、物理层)既有上网功能,又自带交换机功能,一个口可以联网,另几个口可以连接局域网的几台电脑,普通用户一般只使用路由器即可,但一般企业级是交换机和路由器分开使用。
- 另外一个网络(比如两个教室通信)计算机3、计算机4同样连接交换机,再连路由器。
- 网络号:192.168.3.0(0代表主机位),掩码255.255.255.0,其中的计算机IP地址可以是3.1、3.2、3.3 等等;
- 计算机4的IP地址:192.168.3.4,MAC地址:3.4@mac;
- 路由器有2个网卡,归属于上面两个网络。
通信流程
此时想要计算机1(192.168.1.4)和计算机4(192.168.3.4)进行通信,它们没有在同一个局域网,需要通过路由网关。
通过路由条目1只能访问直连交互的网络,如计算机2,而计算机4是另外一个网段,需要走路由条目2的网关,即通过交换机转发到路由器(即默认网关,这就是下一跳),进行路由。
这时计算机1的目标地址是192.168.3.4,而下一跳地址192.168.1.1,这个数据包怎么封呢?就需要在目标IP地址之上再封一层MAC地址(1.1@mac);
那么这时又有一个问题:计算机1刚开机时,怎么知道路由器的MAC地址呢?
计算机通过arp -a
是可以采集到局域网中除了自身之外的所有计算机的IP地址和MAC地址的表格,但是刚开机时下面这张表是空的。
那上面这张表是如何出来的呢?这就用到了ARP协议。计算机1开机后先要单独封一个ARP数据包,而数据包格式必须要有IP地址和MAC地址(此时表为空),此时计算机1要单独封一个特殊的数据包,发送出去:
- 目标MAC地址:FFFFFFF;
- 目标IP地址:192.168.1.1;
- 当数据包发送至交换机(本身是二层,没有网络层的路由表,不具备路由功能),由于交换机有一个约束,当遇到目标MAC地址为全F时,就会将该数据包广播出去,转发至除了计算机1以外的所有机器,包括连接的路由器;
- 而该数据包到达除路由器以外的机器,由于目标IP地址不是自己,都会将数据包丢弃,只有路由器(192.168.1.1)发现目标IP地址是自己,才会响应这个数据包。
- 当路由器展开这个包,发现标识ARP协议包,就会将自己的MAC地址再封一个包(目标MAC地址:1.4@mac,目标IP地址:192.168.1.4,以及源IP和源1.1@mac地址);
- 响应包发送至交换机,因为交换机自带学习能力,会记录port->mac,比如计算机1经过交换机发送数据包时会记录一条:1:1.4@mac,即1号口计算机1的MAC地址;
- 这时路由器响应给计算机1的数据包到达交换机后,就不会再被广播出去,而是通过MAC地址记录将包直接转发至1号口的计算机1,这时该计算机就学到了一条路由器的IP地址到MAC地址的映射记录。
注:正常情况下,计算机网卡只要一通电,就会向外通告本机的IP地址和MAC地址,这样在之后的通信中就会减少了ARP过程,以保证可以直接使用IP->MAC地址映射。
8. 这时计算机1会重新封一个包:
- 目标MAC地址:1.1@mac,源MAC地址:1.4@mac;
- 目标IP地址:192.168.3.4,源IP地址:192.168.1.4。
- 这时经过交换机(学习过1.1@mac)定点转发给路由器(路由器route -n 存在路由条目1.0和3.0),就会转发至路由器的下一跳地址192.168.3.4这个IP地址和MAC地址(MAC地址每跳一次都会更换,而目标IP地址不变),如下图所示,源MAC地址修改为1.1@mac:
- 之后数据包通过另一个交换机转发至计算机4后,发现是自己的IP地址,就会展开,根据端口号找到对应的进程。
- 当响应数据包时,再通过交换机-路由器-交换机-计算机1。
5、物理层
利用传输介质为数据链路层提供支持,实现相邻计算机节点之间比特流的透明传递。