一个完整的HTTP请求的过程
此举例为抛砖引玉,引导大家进入思考状态。
当你按输入www.baidu.com ,浏览器接收到这个消息之后,浏览器根据自己的算法识别出你要访问的URL,为您展示出来搜索页面和广告,那么这些经历了哪些过程呢?
大致过程如下:
- (1)浏览器查询 DNS,获取域名对应的IP地址; 具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服 务器进行查询等。
- (2)浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
- (3)TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
- (4)服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
- (5)浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
- (6)浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
下面,我们从底到上来一层层理解这个问题。
网络参考模型
开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写:OSI;简称为OSI模型)是一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。定义于ISO/IEC 7498-1。(摘自维基百科)
7 |
应用层 application layer |
例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP、TLS |
6 |
表示层 presentation layer |
例如XDR、ASN.1、SMB、AFP、NCP |
5 |
会话层 session layer |
例如ASAP、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、IGMP、Winsock、BSD sockets |
4 |
传输层 transport layer |
例如TCP、UDP、RTP、SCTP、SPX、ATP、IL |
3 |
网络层 network layer |
例如IP、ICMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、X.25 |
2 |
数据链路层 data link layer |
例如以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP |
1 |
物理层 physical layer |
例如线路、无线电、光纤 |
通常人们认为OSI模型的最上面三层(应用层、表示层和会话层)在TCP/IP组中是一个应用层。
由于TCP/IP有一个相对较弱的会话层,由TCP和RTP下的打开和关闭连接组成,并且在TCP和UDP下的各种应用提供不同的端口号,这些功能能够被单个的应用程序(或者那些应用程序所使用的库)增加。与此相似的是,IP是按照将它下面的网络当作一个黑盒子的思想设计的,这样在讨论TCP/IP的时候就可以把它当作一个独立的层。
TCP/IP 参考模型
4 |
应用层 application layer |
例如HTTP、FTP、DNS (如BGP和RIP这样的路由协议,尽管由于各种各样的原因它们分别运行在TCP和UDP上,仍然可以将它们看作网络层的一部分) |
3 |
传输层 transport layer |
例如TCP、UDP、RTP、SCTP (如OSPF这样的路由协议,尽管运行在IP上也可以看作是网络层的一部分) |
2 |
网络互连层 internet layer |
对于TCP/IP来说这是因特网协议(IP) (如ICMP和IGMP这样的必须协议尽管运行在IP上,也仍然可以看作是网络互连层的一部分;ARP不运行在IP上) |
1 |
网络访问(链接)层 Network Access(link) layer |
例如以太网、Wi-Fi、MPLS等。 |
下面一张图更有助于你的理解
HTTP 协议与 TCP/IP 协议
**HTTP 是 TCP/IP 参考模型中应用层的其中一种实现。**HTTP 协议的网络层基于 IP 协议,传输层基于 TCP 协议:HTTP 协议是基于 TCP/IP 协议的应用层协议。
TCP/IP 协议需要向程序员提供可编程的 API,该 API 就是 Socket,它是对 TCP/IP 协议的一个重要的实现,几乎所有的计算机系统都提供了对 TCP/IP 协议族的 Socket 实现。
Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换。
- 流格式套接字(SOCK_STREAM) 流格式套接字(Stream Sockets)也叫“面向连接的套接字”,它基于 TCP 协议,在代码中使用 SOCK_STREAM 表示。
- 数据报格式套接字(SOCK_DGRAM) 数据报格式套接字(Datagram Sockets)也叫“无连接的套接字”,基于 UDP 协议,在代码中使用 SOCK_DGRAM 表示。 TCP与UDP 协议区别与优劣势 TCP 是面向连接的传输协议,建立连接时要经过三次握手,断开连接时要经过四次握手,中间传输数据时也要回复 ACK 包确认,多种机制保证了数据能够正