内容来源于小林coding+自己总结
为什么要有 TCP/IP 网络模型? 对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,而对于不同设备上的进程间通信,就需要网络通信,而设备是多样性的,所以要兼容多种多样的设备,就协商出了一套通用的网络协议。
这个网络协议是分层的,每一层都有各自的作用和职责,接下来就根据「 TCP/IP 网络模型」分别对每一层进行介绍。
如何计算网络地址和主机地址? 将 IP 地址分成两种意义:
一个是网络号,负责标识该 IP 地址是属于哪个「子网」的; 一个是主机号,负责标识同一「子网」下的不同主机; 怎么分的呢?这需要配合子网掩码才能算出 IP 地址 的网络号和主机号。
举个例子,比如 10.100.122.0/24,后面的/24表示就是 255.255.255.0 子网掩码,255.255.255.0 二进制是「11111111-11111111-11111111-00000000」,大家数数一共多少个1?不用数了,是 24 个1,为了简化子网掩码的表示,用/24代替255.255.255.0。
知道了子网掩码,该怎么计算出网络地址和主机地址呢?
将 10.100.122.2 和 255.255.255.0 进行按位与运算,就可以得到网络号,如下图:
将 255.255.255.0 取反后与IP地址进行进行按位与运算,就可以得到主机号。
IP协议的两个重要的能力 寻址:先匹配到相同的网络号(表示要找到同一个子网),才会去找对应的主机。 路由:就是要找到目标地址的子网,找到后进而把数据包转发给对应的网络内。 所以,IP 协议的寻址作用是告诉我们去往下一个目的地该朝哪个方向走,路由则是根据「下一个目的地」选择路径。寻址更像在导航,路由更像在操作方向盘。
TCP/IP是哪几层? 由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层。
每一层的封装格式:
网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。
从输入 URL 到页面展示到底发生了什么?(非常重要) URL解析,从url中解析出协议、WEB服务器和文件名,然后根据这些信息生成HTTP请求消息。 然后就需要委托操作系统把HTTP请求消息发送给WEB服务器,但在发送之前需要查询到服务器的ip地址。 浏览器会先看自己的缓存里是否有,如果有就直接返回,没有就去问操作系统; 操作系统也会看自己的缓存,如果有就返回,没有就去hosts文件里看; 如果host文件里还没有,那浏览器会向本地DNS服务器发送DNS解析请求,本地DNS服务器会逐级查询,最终找到对应的IP地址。(逐级查询的流程就比较多了) 获取MAC地址:当浏览器得到 IP 地址后,数据传输还需要知道目的主机 MAC 地址,因为应用层下发数据给传输层,TCP 协议会指定源端口号和目的端口号,然后下发给网络层。网络层会将本机地址作为源地址,获取的 IP 地址作为目的地址。然后将下发给数据链路层,数据链路层的发送需要加入通信双方的 MAC 地址,本机的 MAC 地址作为源 MAC 地址,目的 MAC 地址需要分情况处理。通过将 IP 地址与本机的子网掩码相结合,可以判断是否与请求主机在同一个子网里,如果在同一个子网里,可以使用 ARP 协议获取到目的主机的 MAC 地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。 建立TCP连接:主机将使用目标 IP地址和目标MAC地址发送一个TCP SYN包,请求建立一个TCP连接,然后交给路由器转发,等路由器转到目标服务器后,服务器回复一个SYN-ACK包,确认连接请求。然后,主机发送一个ACK包,确认已收到服务器的确认,然后 TCP 连接建立完成。 HTTPS 的 TLS 四次握手:如果使用的是 HTTPS 协议,在通信前还存在 TLS 的四次握手 发送HTTP请求:连接建立后,浏览器会向服务器发送HTTP请求。 服务器处理请求并返回响应:服务器收到请求后,会扒开数据包的 MAC 头部、IP头、TCP的头,取到HTTP报文。 然后这里还可以扩展一些,就是我们一般在java的层面,Servlet容器会从HTTP报文中解析出请求行、消息头和消息体,并交给MVC去处理 DispatcherServlet接收到请求后,根据HandlerMapping(处理器映射器)找到对应的处理器(Controller)来执行处理器的业务逻辑,可能会调用下层的Service以及dao层进行数据的CRUD。 处理完以后返回ModelAndView;然后在通过ViewResolve对ModelAndView进行处理,返回View视图;最后一步是进行渲染View,产生response 浏览器接收response并渲染页面 因为HTTP1.1是基于TCP的一个长连接,所以这里并不会立即四次挥手去断开 OSI网络模型有哪几层? 有 7 层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层。
每一层负责的职能都不同,如下:
●应用层,负责给应用程序提供统一的接口;
●表示层,负责把数据转换成兼容另一个系统能识别的格式;
●会话层,负责建立、管理和终止表示层实体之间的通信会话;
●传输层,负责端到端的数据传输;
●网络层,负责数据的路由、转发、分片;
●数据链路层,负责数据的封帧和差错检测,以及 MAC 寻址;
●物理层,负责在物理网络中传输数据帧;