此举例为抛砖引玉,引导大家进入思考状态。
当你按输入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 包确认,多种机制保证了数据能够正确到达,不会丢失或出错。 UDP 是非连接的传输协议,没有建立连接和断开连接的过程,它只是简单地把数据丢到网络中,也不需要 ACK 包确认。 如果只考虑可靠性,TCP 的确比 UDP 好。但 UDP 在结构上比 TCP 更加简洁,不会发送 ACK 的应答消息, 也不 会给数据包分配 Seq 序号,所以 UDP 的传输效率有时会比 TCP 高出很多,编程中实现 UDP 也比 TCP 简单。 与 UDP 相比,TCP 的生命在于流控制,这保证了数据传输的正确性。
最后需要说明的是:TCP 的速度无法超越 UDP,但在收发某些类型的数据时有可能接近 UDP。例如,每次交换的数据量越大,TCP 的传输速率就越接近于 UDP。
分享更多网络底层原理知识点,内容包括Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等。后台私信【架构】获取
TCP/IP 协议、HTTP 协议和 Socket 有什么区别?从包含范围来看,它们的继承关系是这样的:
从横向来看,它们的继承关系是这样的: