前言

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

计算机网络体系结构

TCP/IP网络协议栈

TCP/IP协议层次划分



首先从网络通信的分层模型讲起:七层模型,亦称OSI(Open System Interconnection)模型。自下往上分为:物理层、据链路层、网络层、传输层、会话层、表示层和应用层。所有有关通信的都离不开它,下面这张图片介绍了各层所对应的一些协议和硬件。



通过上图,我知道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协议来连接网络。

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

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

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

TCP的三次握手和四次挥手

为什么要进行三次握手?

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

  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. 长连接资源的新建功能

TCP/UDP 协议和 HTTP/FTP/SMTP 协议之间的区别的更多相关文章

  1. Java基础之UDP协议和TCP协议简介及简单案例的实现

    写在前面的废话:马上要找工作了,做了一年的.net ,到要找工作了发现没几个大公司招聘.net工程师,真是坑爹呀.哎,java就java吧,咱从头开始学呗,啥也不说了,玩命撸吧,我真可怜啊. 摘要: ...

  2. TCP和UDP协议之间的区别与原理

    一.TCP和UDP协议之间的区别 TCP是基于连接的,而UDP是基于非连接的. TCP传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页 ...

  3. ftp用的是tcp还是udp_如何通俗地解释TCP和UDP协议和HTTP、FTP、SMTP等协议之间的区别

    HTTP协议 老王喜欢看岛国小片,时常泡在论坛上和网友交流最新资讯,老王是通过浏览器浏览网页的,而浏览器是借助HTTP协议与论坛服务器沟通交流. FTP协议 老王购买了该网站的会员,可以无限制下载高清 ...

  4. TCP/IP协议和OSI协议

    作为一个与网络密切相关的Web前端工程师,TCP/IP和OSI模型不可不知,至少要知道一下这些常识性知识,在这我做一下记录 TCP/IP协议簇: TCP/IP是一组协议的代名词,包括许多别的协议,组成 ...

  5. tcp/ip协议和http协议

    TCP/IP 是一类协议系统,它是用于网络通信的一套协议集合. 传统上来说 TCP/IP 被认为是一个四层协议:应用层(telnet, ftp, http, smtp, dns等),传输层(tcp, ...

  6. TCP/IP协议和socket

    1.传输层基于tcp协议的三次握手和四次挥手? 传输层有两种数据传输协议,分别为TCP协议和UDP协议,其中TCP协议为可靠传输,数据包没有长度设置,理论可以无限长,而UDP协议为不可靠传输,报头一共 ...

  7. Linux网络编程——连接和面向连接的协议之间没有区别

    网络编程中最重要的概念就是连接取向(connection-oriented)和无连接(connectionless)协议.虽然本质.两者之间的区别是不难理解,编程的人来说,却是个非常easy混淆的问题 ...

  8. 【T01】理解面向连接和无连接协议之间的区别

    1.面向连接和无连接指的是协议,本质区别在于:对于无连接协议来说,每个分组的处理都独立于其他的分组. 而对于面向连接的协议,协议实现维护了当前分组与后继分组有关的状态信息. 2.无连接就是指udp,分 ...

  9. TCP/IP协议和HTTP协议 浩哥指教

    TCP和IP在HTTP协议的上层,HTTP算是应用层,IP协议建立的是电脑跟电脑之间的联系,具体过程是,物理上,通过网线,解析MAC地址,到达路由,路由告诉数据将要去哪里,对方电脑通过NDS解析,解析 ...

  10. Http TCP/IP协议和socket之间的区别和联系

    总结,TCP/IP是传输层协议,主要解决数据如何在网路中传输,socket是TCP/IP协议的具体实现,是对TCP/IP协议的封装和应用,属于程序员层面,HTTP是应用层协议,应用层协议很多,类似的像 ...

随机推荐

  1. 鸿蒙HarmonyOS实战-ArkUI事件(手势方法)

    一.手势方法 应用程序的手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式.手势操作可以包括点击.滑动.双击.捏合等动作,用于实现不同的功能和操作. HarmonyOS中常见的手势操作及其 ...

  2. anaconda安装cv2库

    在安装cv2库之前,需要进行以下准备工作: 安装Anaconda 如果还没有安装Anaconda,可以在官网上下载对应操作系统的Anaconda安装包,然后按照提示进行安装.安装完成后,可以在终端中输 ...

  3. Unraid 使用 Docker Compose 安装 Immich 套件无法启用人脸识别的原因及修复方法

    原因 问题原因是官方教程中的 docker-compose.yml 指明的机器学习组件 immich-machine-learning 中的 container_name 与 也就是 docker-c ...

  4. apisix~authz-keycloak插件介绍

    参考:https://apisix.apache.org/docs/apisix/plugins/authz-keycloak/ kc插件源码梳理及原理说明 如果只是进行keycloak颁发的toke ...

  5. 腾讯云服务器Ubuntu-配置mysql,nginx,nodejs

    ​趁着618腾讯云服务器的促销活动,笔者买了最低配置的云服务器,用作学习. 接上一篇文章的内容,系统方面选择了Ubuntu,版本是20.04 LTS. 选择Ubuntu的原因,主要是因为Ubuntu一 ...

  6. nohup Command [ Arg … ] [ & ]

    nohup 英文全称:no hang up 不挂断的意思.退出终端不挂断程序的运行.在默认的情况下,会输出一个名叫 nohup.out 的文件到当前目录下.nohup Command [ Arg - ...

  7. golang 接口动态派发性能问题

    测试代码 package main type Duck interface { Quack() } type Cat struct { Name string } //go:noinline func ...

  8. Android 13 - Media框架(18)- CodecBase

    关注公众号免费阅读全文,进入音视频开发技术分享群! 从这一节开始我们会回到上层来看ACodec的实现,在这之前我们会先了解ACodec的基类CodecBase.CodecBase.h 中除了声明有自身 ...

  9. 怎么使用Stable diffusion中的models

    Stable diffusion中的models Stable diffusion model也可以叫做checkpoint model,是预先训练好的Stable diffusion权重,用于生成特 ...

  10. RHEL9破解root密码

    使用rhel8版本的破解方法破解rhel9版本root密码时候,出现问题 在内核参数重置页面输了rd.break后,要么ctrl+d 要么输密码 rhel9破解root密码,应该选择的内核模式为第二行 ...