TCP/UDP 协议和 HTTP/FTP/SMTP 协议之间的区别

前言

我们经常会听到HTTP协议、TCP/IP协议、UDP协议、Socket、Socket长连接、Socket连接池等字眼,然而它们之间的关系、区别及原理并不是所有人都能理解清楚。

计算机网络体系结构

image

TCP/IP网络协议栈

image

TCP/IP协议层次划分

image
首先从网络通信的分层模型讲起:七层模型,亦称OSI(Open System Interconnection)模型。自下往上分为:物理层、据链路层、网络层、传输层、会话层、表示层和应用层。所有有关通信的都离不开它,下面这张图片介绍了各层所对应的一些协议和硬件。
image
通过上图,我知道IP协议对应于网络层,TCP、UDP协议对应于传输层,而HTTP协议对应于应用层,OSI并没有Socket,那什么是Socket,后面我们将结合代码具体详细介绍。

TCP和UDP连接

TCP和UDP属于TCP/IP协议族的传输层协议,可以比喻为火车和高铁,一个可靠,一个不可靠。HTTP, FTP,SMTP属于应用层的封装协议,这些协议在传输协议有对应的端口,比如HTTP对应TCP的80端口,FTP对应TCP的21和22端口,SMTP对应TCP的25端口。

TCP和UDP使用IP协议从一个网络传送数据包到另一个网络。

把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。

TCP提供有保证的数据传输,而UDP不提供。

这意味着TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。

HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。

TCP是一种允许我们安全传输数据的机制,需要IP协议来连接网络。
image

无状态协议: UDP(用户数据报协议)、HTTP(超文本传输协议)

HTTP 是一种无状态协议,因为客户端和服务器仅在当前请求期间彼此知道。 由于协议的这种性质,客户端和服务器都不会保留网页的各种请求之间的信息。

有状态协议: Telnet、FTP(文件传输协议)、SMTP(邮箱传输协议)

TCP的三次握手和四次挥手

image

为什么要进行三次握手?

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

  1. 第一次握手,客户端发送连接请求到服务端,服务端能够收到请求,说明服务端的接收能力和客户端的发送能力都没问题。(服务端知道客户端的发送没问题,但是客户端自己不知道,因此需要第二次握手,服务端来告诉客户端,你的请求,我收到了,你的发送没问题。同时,我想验证一下我的发送有没有问题)

  2. 第二次握手,客户端收到服务端的响应,说明客户端知道自己的接收能力和 服务器端的发送能力是没问题的。(但是服务器自己不知道是否发送成功。因此需要第三次握手。)

  3. 第三次握手,客户端告诉服务端,你的发送能力是没问题的。

三次握手完成之后,服务端和客户端都知道自己以及对方的发送和接收能力都是OK的,就可以正常传输数据。

为什么要 TCP 四次挥手?

挥手是为了确认服务端和客户端都已经发送完数据,都想关闭连接,TCP连接是全双工、对等的模式,因此想要关闭,必须是双方都想关闭的状态,才能断开连接。

  1. 第一次挥手,客户端告诉服务端,我没有数据想要发送了,我们可以关闭连接了。服务器端收到消息后,但是现在很忙,出于礼貌性,得回复客户端,我收到你的请求了,因此需要第二次挥手。

  2. 第二次挥手,服务器端告诉客户端,我收到你的关闭请求了,但是,我现在还有数据没有发完,我还不能关闭,你再等等。
    客户端收到服务端的回复以后,就让自己处于半关闭状态,不发送数据,但是可以接收数据。
    等到服务器端发送完成以后,就需要告诉客户端,我发完了,因此需要第三次挥手。

  3. 第三次挥手:服务端告诉客户端,我的数据发送完了,咱们可以关闭连接了。客户端收到以后,需要回复服务端,好的,所以第四次挥手就来了。

  4. 第四次挥手: 客户端告诉服务端,你的关闭连接请求我收到了,你可以关闭连接了。

为什要有 2MSL 等待延迟?

客户端给服务端发送的 ACK=1 丢失,服务端等待 1MSL 没收到,然后重新发送消息需要 1MSL。

如果再次接收到服务端的消息,则重启 2MSL 计时器,发送确认请求。客户端只需等待 2MSL,如果没有再次收到服务端的消息,就说明服务端已经接收到自己确认消息;此时双方都关闭的连接,TCP 四次分手完毕。

如果双方建立连接,一方出问题

为了防止出现千年等一回的情况,已经建立连接,但是服务端一直等待接收,发送端出现问题一直不能发送。

所以设计一个保活的计时器,如果一方出现问题,另一方过了这个计时器的时间,就发送试探报文,以后每隔 75 秒发送一次。若一连发送 10 个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

Socket长连接

长连接指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接(心跳包),一般需要自己做在线维持。

短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。

比如Http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。
其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。

通常短连接操作步骤:连接→数据传输→关闭连接

而长连接操作步骤是:连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接

什么时候用长连接,短连接?

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。

例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成Socket错误,而且频繁的Socket创建也是对资源的浪费。

Socket连接池

什么是Socket连接池,池的概念可以联想到是一种资源的集合,所以Socket连接池,就是维护着一定数量Socket长连接的集合。它能自动检测Socket长连接的有效性,剔除无效的连接,补充连接池的长连接的数量。

使用连接池能够使性能最大化,减少连接创建时间,合理控制资源的使用,最终保证服务的稳定性。

从代码层次上其实是人为实现这种功能的类,一般一个连接池包含下面几个属性:

  1. 空闲可使用的长连接队列
  2. 正在运行的通信的长连接队列
  3. 等待去获取一个空闲长连接的请求的队列
  4. 无效长连接的剔除功能
  5. 长连接资源池的数量配置
  6. 长连接资源的新建功能
posted @ 2023-04-28 17:21  zhαojh  阅读(355)  评论(0编辑  收藏  举报