HTTP/HTTPS、TCP、IP、Socket、Servlet,它们是什么关系?

252 阅读4分钟

这几个名词,在网络通信中经常出现,很多人都只是有个模糊的概念,它们之间的关系总是感觉不清不楚,这里我不想长篇大论的去做名词解释,只想关于它们做一个梳理。

1. 网络分层到底是几层?7层、4层还是5层?

在标准化领域中,有一个组织叫做国际标准化组织(International Organization for Standardization,简称为ISO),它研究并制定了一个标准网络互连模型,叫做开放式系统互联(Open System Interconnect,简称为OSI)。其中定义了网络互联的框架,分为七层,即OSI开放系统互连参考模型。

而在TCP/IP协议栈中,网络被分为四层,它们和七层的对应关系大致如下:

image.png
(图片来自这里。)

那么为什么要有两种分层方式呢?
实际上,TCP/IP协议栈是先于OSI出现的,当时每个网络的设计都不同,除非是同个生产商的,不然很难互连起来。为了统一网络架构,才出现了OSI这样的标准化模型。但是后来TCP/IP成为了Internet的主流,而且OSI协议栈比较复杂不太实用,于是目前的网络设备基本上都是按照ICP/IP协议栈来生产的。

基于这样的历史原因,在学习计算机网络时,通常会采用一种折中的方法,集OSI和TCP/IP的优点在一起,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。

image.png

2. HTTP和HTTPS是什么关系?

HTTP是超文本传输协议,它的特点是无状态、无连接,而且很不安全。明文传输可能会被窃听,缺少身份认证可能遭遇伪装,缺少报文完整性验证可能遭到篡改。

为了解决上述问题,HTTPS应运而生。HTTPS是一种安全的通信传输协议,它还是利用HTTP进行通信,但是通过SSL/TLS协议进行安全加密。使用HTTPS的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

2. HTTP/HTTPS、TCP和IP是什么关系?

根据TCP/IP协议栈的分层架构,HTTP/HTTPS属于应用层,TCP属于传输层,IP属于网络层。

HTTP/HTTPS是在TCP建立连接通信的基础上进行传输的,为什么选择TCP而不是UDP?
因为TCP是基于连接的可靠性传输服务,建立/释放连接的过程就是面试中经常考的三次握手和四次挥手。而UDP是无连接的不可靠的传输,只是尽最大努力交付,UDP比TCP更快,因此常作为对实时性要求较高的协议的传输层协议。

HTTP基于TCP,那为啥TCP是有连接的,而HTTP却是无连接的?
TCP的有连接是指基于网络底层的数据传输,HTTP的无连接是指基于应用层面的沟通交互。

HTTP的无连接是指在客户端和服务器之间每次请求和响应的交互都是独立的,彼此之间没有任何关联。即每次连接只处理一次请求。它的优点是可以减少通信的开销,提高传输效率。但缺点是无法保持客户端和服务器之间的状态信息,每次请求都需要重新建立连接,无法实现持久连接,无法支持实时通信等。
TCP协议在建立连接时,需要进行三次握手,建立连接后,客户端和服务器之间可以保持持久连接,实现数据的可靠传输和流控制。在数据传输完成后,通过四次挥手断开连接。

TCP又以IP为基础,IP协议的目的是将数据从一台主机发送到另一台主机,我们常说的IP地址就是位于IP协议头中,而TCP则保证了IP协议包的可靠性传输。

3. Socket又是什么,跟网络协议有什么关系?

上边我们说到,TCP在建立/释放连接时,需要进行三次握手和四次挥手,但是到底怎么握怎么挥,如何去实现呢?实际上,Socket就是操作系统为TCP封装的一整套建立连接、发送数据、断开连接的一组接口,抽象为套接字这么一个逻辑概念。

image.png

4. 那Servlet呢,跟上边的那些有什么联系?

通过Socket建立TCP连接后,就可以通过HTTP协议发送消息了,请求到达服务端之后,服务器需要从线程池中取出一个线程来处理发送过来的请求,并按照HTTP协议进行解析,然后分配给特定的Servlet进行处理。

Servlet的本质是一个Java对象,这个对象拥有一系列的方法来处理HTTP请求。常见的方法有doGet(),doPost()等。Web容器中包含了多个Servlet,特定的HTTP请求该由哪一个Servlet来处理是由Web容器中的web.xml来决定的。

关于Servlet的更多内容可以参考这篇文章