浏览器发送web请求过程
首先带大家了解下浏览器发送web请求的过程,才能引出后面的话题。
- 用户在浏览器中输入网址(URL),按下回车
- 浏览器向DNS系统查询域名对应的IP地址(这里使用的是UDP协议)。具体包括浏览器搜索自身DNS缓存,搜索操作系统DNS缓存,读取本地host文件,向本地DNS服务器进行查询
- 浏览器获得域名对应的IP地址后,委托协议栈向服务器请求建立连接,发起三次握手
- TCP/IP连接建立后,浏览器才真正向服务器发送请求。服务器收到请求后,会先判断其URI指定的文件名,若是静态文件则直接返回其内容(如HTML文档);若为程序文件,则会将请求参数映射到特定的请求处理器进行处理,并将处理结果或相应的视图返回给浏览器
- 浏览器解析并渲染视图。若遇到对js、css等静态文件的引用,则重复上述步骤(4)向服务器请求这些资源
- 浏览器根据请求到的资源和数据渲染完后,最终向用户呈现一个完整的页面
协议栈
科普下上述提到的协议栈,这图片够清晰了吧(懒得文字描述╰( ̄ω ̄o))
UDP
UDP只负责单纯地发送包,因此不需要重发的数据或对实时性要求较高时使用UDP。请求控制用的短数据,像DNS查询等交换控制信息的操作基本上都可以在一个包的大小范围内解决;还有游戏、媒体通信和实时视频流,即使出现传输错误也可以容忍,也适合使用UDP。
UDP没有TCP的接收确认、窗口等机制,因此在收发数据之前也不需要交换控制信息,也就是说不需要建立和断开连接的步骤,也不会像TCP那样对包的送达状态进行监控,协议栈也不知数据是否有误。这就决定了UDP是不可靠的。
但是这也不会引发什么大问题,也就是出错时收不到来自对方的回复,应用程序会注意到这个问题并重新发送一遍数据。
TCP/IP
最早的TCP/IP协议原型设计相当于现在的TCP和IP在一起的样子,后来才拆分成TCP和IP两个协议
TCP模块
TCP用于建立通讯连接。
TCP连接的端点叫做套接字(socket)或插口,而套接字socket=(IP地址:端口号)1;
每一条TCP连接唯一地被通信两端的两个端点(即两个套接字所确定),即:
TCP连接 ::= {socket1, socket2} = {(IP1:port1), (IP2:port2)}
IP模块
TCP模块在执行连接、收发、断开等各阶段操作时,都需要委托IP模块将数据封装成包发送给通信对象。因此TCP模块需要向IP模块指明通信对象的IP地址。
IP模块收到委托后,会将包的内容当作一整块数据,在前面加上包含控制信息的头部:
- MAC头部:以太网用的头部,包含MAC地址
- IP头部:IP用的头部,包含IP地址
小结-TCP与UDP的异同
TCP | UDP | |
---|---|---|
面向连接 | √ | ╳ |
可靠 | √ | ╳ |
一对一 | √ | √ |
一对多 | ╳ | √ |
多对一 | ╳ | √ |
多对多 | ╳ | √ |
传输 | 面向字节流 | 面向报文 |
适用情况 | 要求传输内容可靠 | 无需重发的短数据,实时性要求较高 |
协议栈会将客户端与服务器创建的套接字连接起来形成虚拟管道,用于传输数据 ↩︎