一、 Socket
(1)什么是socket
-
套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。
-
它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。(其实就是bind绑定)
(2)为什么需要socket
-
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。
-
为了区别不同的应用程序进程和连接,计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。【服务端利用多进程或多线程连接多个应用程序】
-
应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
(3)建立socket连接
简单描述,具体查看博文:Linux 网络编程——socket 网络编程
-
(1)建立Socket连接至少需要一对套接字(socket函数),其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。
-
(2)bind做网络通信必须的五种信息绑定。
-
(3)套接字之间的连接过程分为三个步骤:服务器监听(listen),客户端请求(connect),连接确认(accept)。
(4)socket分类
- SOCK_STREAM,流式套接字,用于TCP
- SOCK_DGRAM,数据报套接字,用于UDP
- SOCK_RAW,原始套接字,对于其他层次的协议操作时需要使用这个类型
二、HTTP(基于TCP)
(1)HTTP的概念
- HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
(2)HTTP连接的特点
(2.1)连接请求:一次连接
- HTTP连接最显著的特点是客户端发送的每次请求服务器都需要回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为一次连接
1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
2)在HTTP> 1.1中,则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。–>异步请求
(2.2)连接请求:短连接(注意:socket是长连接)
-
由于HTTP在每次请求结束后服务端都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,客户端需要向服务器不断地发起连接请求。
-
若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一保持连接的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。
三、TCP/IP协议簇(簇:包含多个协议)
- TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。
注意:TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
- TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。
就像配置串口通信一样,通信双方要提前制定好规则(传输速率,传输格式),这样接受信息的过程、接受到的信息才会正确。
四、HTTP、Socket、TCP的联系
(1)SOCKET是操作TCP/IP的编程接口
-
创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),例如当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
-
从程序员的层面上来说:socket则是对TCP/IP协议的封装和应用。socket是封装好的接口,便于程序员调用
-
Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
-
实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现 只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、 listen、connect、accept、send、read和write等等。
-
“TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。”
(2)SOCKET与HTTP
(2.1)长连接与短连接
-
Socket是长连接:由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开,这称为长连接(socket会自动向服务端发送心跳包吧,这样可一直保持连接)。
-
HTTP是短连接:HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。【发送请求 -> 回复 -> 断开】,这称为短连接。
(2.2)保持数据的实时同步
很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。
(1)此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;
在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
(2)若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端。因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
(3)TCP/IP和HTTP协议
-
TPC/IP协议是传输层协议,主要解决数据在网络中如何传输,而HTTP是应用层协议,主要解决如何包装数据。
-
“我们在传输数据时,可以只使用(传输层)TCP/IP协议,双方就能收发数据,但是无法解析数据;如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,HTTP协议解决了浏览器和服务器之间通讯协议的数据格式解析;,应用层协议有很多,比如HTTP、FTP、TELNET等。
五、HTTP、Socket、TCP的区别
关系如下:
(1)Socket(套接字)
- 现在我们了解到TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外提供编程接口,这就是Socket。现在我们知道,Socket跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等,不同语言都有对应的建立Socket服务端和客户端的库。
(2)Socket长连接
-
所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接(心跳包),一般需要自己做在线维持。 短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。比如Http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。
-
通常的短连接操作步骤是:连接→数据传输→关闭连接;
-
而长连接通常就是:连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;
(3)什么时候用长连接,短连接
- 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理 速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成Socket错误,而且频繁的Socket创建也是对资源的浪费。
(4)TCP连接和HTTP连接的区别
- HTTP是基于TCP的,客户端往服务端发送一个HTTP请求时第一步就是要建立与服务端的TCP连接,也就是先三次握手,从HTTP 1.1开始支持持久连接,也就是一次TCP连接可以发送多次的HTTP请求。
(5)TCP连接与Socket连接的区别
- socket层只是在TCP/UDP传输层上做的一个抽象接口层,因此一个socket连接可以基于连接,也有可能基于UDP。基于TCP协议的socket连接同样需要通过三次握手建立连接,是可靠的;基于UDP协议的socket连接不需要建立连接的过程,不过对方能不能收到都会发送过去,是不可靠的,大多数的即时通讯IM都是后者。
(6)HTTP连接与Socket连接的区别
-
HTTP是短连接,Socket(基于TCP协议的)是长连接。尽管HTTP1.1开始支持持久连接,但仍无法保证始终连接,客户端获得响应后,连接将自行终止。而Socket连接一旦建立TCP三次握手,除非一方主动断开,否则连接状态一直保持。
-
HTTP连接服务端无法主动发消息【即单向的】,Socket连接双方请求的发送先后限制【全双工】。这点就比较重要了,因为它将决定二者分别适合应用在什么场景下。HTTP采用“请求-响应”机制,在客户端还没发送消息给服务端前,服务端无法推送消息给客户端。必须满足客户端发送消息在前,服务端回复在后。Socket连接双方类似peer2peer的关系,一方随时可以向另一方喊话。
-
websocket以ws://或wss://开头。
六、总结
联系
-
两个计算机进行网络通讯时使用TCP协议就够了,双方就能收发数据,但是无法解析数据;
-
HTTP协议解决了浏览器和服务器之间通讯协议的数据格式解析;
-
HTTP协议基于TCP协议,通过TCP协议传输数据;HTTP协议是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。HTTP协议主要解决如何包装数据。
-
Socket套接字是通信的基石,是程序员能够进行 TCP/IP 编程的最小单位。是支持TCP/IP协议的网络通信的基本操作单元。当使用 TCP 协议进行连接时,该 Socket 连接就是一个TCP 连接。
区别
-
HTTP是应用层的协议,更靠近用户端;TCP是传输层的协议;而socket是从传输层上抽象出来的一个抽象层,本质是接口
-
HTTP是短连接,Socket(基于TCP协议的)是长连接
-
HTTP连接服务端无法主动发消息,客户端发送的每次请求服务器都需要回送响应。Socket连接双方请求的发送先后限制
-
HTTP位于应用层,socket位于会话层,TCP位于传输层
七、常见问题
(1)什么时候该用HTTP,什么时候该用socket ?
-
用HTTP的情况:
- 双方不需要时刻保持连接在线,比如客户端资源的获取、文件上传等。不需要很频繁或仅获取一次的数据可以通过简单的HTTP请求查询
-
用Socket的情况:
- 聊天应用程序:聊天应用程序仅使用WebSocket建立一次连接,便能在订阅户之间交换,发布和广播消息。它重复使用相同的WebSocket连接,用于发送和接收消息以及一对一的消息传输
- 游戏应用程序:在游戏应用程序中,你可能会注意到,服务器会持续接收数据,而不会刷新用户界面。屏幕上的用户界面会自动刷新,而且不需要建立新的连接,因此在WebSocket游戏应用程序中非常有帮助。
- 即时Web应用程序:即时Web应用程序使用一个Web套接字在客户端显示数据,这些数据由后端服务器连续发送。在WebSocket中,数据被连续推送/传输到已经打开的同一连接中,这就是为什么WebSocket更快并提高了应用程序性能的原因。 例如在交易网站或比特币交易中,这是最不稳定的事情,它用于显示价格波动,数据被后端服务器使用Web套接字通道连续推送到客户端。
(2)浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?
- 在 HTTP/1.0 中,一个服务器在发送完一个 HTTP 响应后,会断开 TCP 链接。但是这样每次请求都会重新建立和断开 TCP 连接,代价过大。所以虽然标准中没有设定,某些服务器对 Connection: keep-alive 的 Header 进行了支持。意思是说,完成这个 HTTP 请求之后,不要断开 HTTP 请求使用的 TCP 连接。这样的好处是连接可以被重新使用,之后发送 HTTP 请求的时候不需要重新建立 TCP 连接,以及如果维持连接,那么 SSL 的开销也可以避免,维持连接后,初始化连接和 SSL 开销消失了,说明使用的是同一个 TCP 连接
- 持久连接:既然维持 TCP 连接好处这么多,HTTP/1.1 就把 Connection 头写进标准,并且默认开启持久连接,除非请求中写明 Connection: close,那么浏览器和服务器之间是会维持一段时间的 TCP 连接,不会一个请求结束就断掉。
(3)一个TCP 连接可以发多少个 HTTP 请求?
- 如果维持连接,一个 TCP 连接是可以发送多个 HTTP 请求的。maxKeepAliveRequests: 每个TCP连接接受最大的Http请求数目,当处理一个keep alive请求达到这个最大值,Tomcat关闭这个连接,设置为失效任何keep alive请求.
(4)一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?
-
HTTP/1.1 存在一个问题,单个 TCP 连接在同一时刻只能处理一个请求,意思是说:两个请求的生命周期不能重叠,任意两个 HTTP 请求从开始到结束的时间在同一个 TCP 连接里不能重叠。虽然 HTTP/1.1 规范中规定了 Pipelining 来试图解决这个问题,但是这个功能在浏览器中默认是关闭的。
-
但是,HTTP2 提供了 Multiplexing 多路传输特性,可以在一个 TCP 连接中同时完成多个 HTTP 请求。
-
那么在 HTTP/1.1 时代,浏览器是如何提高页面加载效率的呢?主要有下面两点:
- 维持和服务器已经建立的 TCP 连接,在同一连接上顺序处理多个请求。
- 和服务器建立多个 TCP 连接。
(5)为什么有时候刷新页面不需要重新建立 SSL 连接?
- 如果采用HTTP采用持久连接,TCP 连接有的时候会被浏览器和服务端维持一段时间。TCP 不需要重新建立,SSL 自然也会用之前的。
(6)浏览器对同一 Host 建立 TCP 连接到数量有没有限制?
假设我们还处在 HTTP/1.1 时代,那个时候没有多路传输,当浏览器拿到一个有几十张图片的网页该怎么办呢?肯定不能只开一个 TCP 连接顺序下载,那样用户肯定等的很难受,但是如果每个图片都开一个 TCP 连接发 HTTP 请求,那电脑或者服务器都可能受不了,要是有 1000 张图片的话总不能开 1000 个TCP 连接吧,你的电脑同意 NAT 也不一定会同意。
所以答案是:有。Chrome最多允许对同一个 Host 建立六个 TCP 连接。不同的浏览器有一些区别。
收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?
如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2,如果能的话就使用Multiplexing 功能在这个连接上进行多路传输。不过也未必会所有挂在这个域名的资源都会使用一个 TCP 连接去获取,但是可以确定的是 Multiplexing 很可能会被用到。
如果发现用不了 HTTP2 呢?或者用不了 HTTPS(现实中的 HTTP2 都是在 HTTPS 上实现的,所以也就是只能使用 HTTP/1.1)。那浏览器就会在一个 HOST 上建立多个 TCP 连接,连接数量的最大限制取决于浏览器设置,这些连接会在空闲的时候被浏览器用来发送新的请求,如果所有的连接都正在发送请求呢?那其他的请求就只能等等了。
参考博文:
网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系文章来源:https://www.toymoban.com/news/detail-788456.html
网络编程知识预备(4) —— SOCKET、TCP、HTTP之间的区别与联系文章来源地址https://www.toymoban.com/news/detail-788456.html
到了这里,关于计算机网络——SOCKET、TCP、HTTP之间的区别与联系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!