前言
关于OSI7层模型相关知识点,以前是总结过一篇文章的,但因为太过详细,显的有些繁琐了,今天复习到计网知识,便重新写一篇精简版的,方便回顾记忆。
1. OSI7层模型和TCP4层模型
1.1 模型各层功能
OSI7层模型 | TCP/IP4层模型 | 功能 | 各层协议簇 |
---|---|---|---|
应用层 | 应用层 | 文件传输,电子邮件,文件服务,虚拟终端 | TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telent |
表示层 | 数据格式化,代码转换,数据加解密 | 无协议 | |
会话层 | 提供建立或解除连接的方法 | 无协议 | |
传输层 | 传输层 | 提供端对端的接口 | TCP,UDP |
网络层 | 网络层 | 为数据包选择路由 | IP,ICMP,RIP,OSPF,BCP |
数据链路层 | 链路层 | 传输有地址的帧及差错控制等功能,提供可靠的数据传输 | SLIP,CSLIP,PPP,ARP,RARP,MTU |
物理层 | 利用传输介质以比特流数据形式透明传输数据 | ISO2100,IEEE802,IEEE |
简言之:OSI7层模型下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。
2. TCP和UDP的区别
类型 | 特点 | 性能 | 应用场景 | 首部字节 | |||
---|---|---|---|---|---|---|---|
是否面向连接 | 传输可靠性 | 传输形式 | 传输效率 | 所需资源 | |||
TCP | 面向连接 | 可靠 | 字节流 | 慢 | 多 | 要求通信数据可靠 (如文件传输,邮件收发等) |
20-60 |
UDP | 无连接 | 不可靠 | 数据报文段 | 快 | 少 | 要求通信速度高 (如视频直播,语音聊天等) |
8 |
- TCP是面向连接的高可靠性的服务,利用握手确认和重传机制保证数据不丢失,利用序列号保证消息包的顺序交互;因其要保证消息的可靠性和有序性,故传输效率较慢;且消息头最少20字节,资源消耗较多。
- UDP是无连接的不保证数据可靠性的服务,可能会丢失数据且无序;因无需考虑连接和可靠性,故传输效率很快,消息头只需8字节,轻量级。
3. 浏览器输入URL后经历的流程
- DNS解析:首先浏览器会依据URL逐层查询DNS服务器缓存,解析URL中的域名所对应的IP地址。DNS缓存从近到远依次是:浏览器缓存:arrow_right: 系统hosts文件:arrow_right: 路由器缓存:arrow_right:IPS服务器缓存 :arrow_right:根域名服务器缓存:arrow_right:顶级域名服务器缓存。找到IP则返回,不会查询后续缓存。
- TCP连接:根据IP地址和默认端口(80)来和服务器建立TCP连接(三次握手)。
- 发送HTTP请求:浏览器发出读取文件的HTTP请求,该请求将发送给服务器。
- 服务器处理请求并返回HTTP报文:服务器对浏览器请求作出响应,并把对应的带有HTML文本的HTTP响应报文发送给浏览器。
- 浏览器解析渲染页面:浏览器接收到HTML,并在显示窗口内渲染它。
- 连接结束:浏览器释放TCP连接(四次挥手)。
4. TCP三次握手和四次挥手(老面试题了)
4.1 三次握手
为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。
详细图解如下:
简单示意图:
- 一次握手:客户端发送带有SYN标志的数据包给服务端;
- 二次握手:服务端发送带有SYN/ACK标志的数据包给客户端;
- 三次握手:客户端发送带有ACK标志的数据包给服务端,连接建立。
4.2 为什么要三次握手?
三次握手的目的是建立可靠的通信信道,通讯就是数据的发送和接收,也就是说三次握手的主要目的是双方确认自己和对方的发送与接收功能是正常的。故三次握手的含义如下:
- 第一次握手:客户端什么都确认不了;服务端确认了对方发送正常
- 第二次握手:客户端可以确认:自己发送、接收正常,对方发送、接收正常;服务端可以确认,自己接收正常,对方发送正常
- 第三次握手:客户端已经确认过自己收发正常,对方收发正常;服务器端收到确认包后可以确认,自己发送、接收正常,对方发送接收也正常
所以只需三次握手就能确认双方收发功能是否正常
4.2.1 第二次握手中,传了SYN,为什么还要传ACK
双方通信无误必须是两者互相发送信息都无误。传了SYN,证明发送方到接收方的通道是没有问题,但是接收方到发送方的通道还需要ACK信号来验证。
4.3 四次挥手
断开一个TCP连接需进行“四次挥手”。
详细图解如下:
文字流程:
- 客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入
FIN_WAIT_1
状态; - 服务器收到这个FIN,回发一个ACK,确认序号为收到的序号加1,此时服务器进入
CLOSE_WAIT
状态,客户端进入FIN_WAIT_2
状态。 - 服务器发送一个FIN,用来关闭服务器到客户端的数据传送,服务器进入
LAST_ACK
状态。 - 客户端收到FIN后,进入
TIME_WAIT
状态,接着回发一个ACK给服务器;服务器进入CLOSED
状态,客户端在经过2MSL后也会进入CLOSED
状态,完成四次挥手。
举个栗子:
我和朋友打电话,通话即将结束时,我说:“我没啥要说的了”,朋友回答:“好的,我知道了”,但是朋友可能还要话要讲,所以我不能直接挂断电话,于是朋友又说了一些话,最后朋友回答:“我说完了”,我回答:“知道了,那我挂了”,这样通信才算结束。