之前我们介绍了OSI的网络模型,这一节我们来聊聊socket,tcp,http的区别,本文主要是学习笔记,需要结合内容借鉴一哈这位大佬的博客,有需要的朋友也可以看看,这里有传送门。
一、socket
1、什么是socket
通常我们在Linux环境下要搭建tcp与udp的客户端与服务器,都会用到socket,那这个关键字到底是什么呢?其实套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。
它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。(其实就是bind绑定)
2、为什么要用socket
在TCP/IP分层模型中应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。
为了区别不同的应用程序进程和连接,计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。
应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。说白了应用层与传输层之间就需要socket来搭建桥梁通道。
3、建立socket的过程
前面我已经学习过Linux网络编程了,后面有需要我会专门做一期tcp/udp客户端与服务器的博客,现在已经对这一个过程有了深刻的认识,由于本文更多了解的是概念性的东西,在这里不做socket编程的展开。
(1)建立Socket连接至少需要一对套接字(socket函数),其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。
(2)bind做网络通信必须的五种信息绑定。
(3)套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
(4)通常还可以在服务器端设置多进程,多线程来并发接入客户端,可以实现多机通信。
二、HTTP
1、什么是HTTP
HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机,电脑联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
2、HTTP的连接过程
HTTP连接的过程,因为是TCP协议会在建立连接到关闭连接的过程会进行“三次握手”与“四次挥手”的过程。
三次握手
这三次通信分别是:
1、客户端向服务端发送一个数据包,告诉服务端需要建立连接;
2、服务端收到客户端发送的数据包之后,会返回一个数据包,通知客户端,我已经收到你的连接请求;
3、客户端收到服务端返回的信息后,知道服务端已经准备好建立连接,但是还需要再发送一个数据包给服务端,用于告诉服务端我已经收到你的回复了。
这个时候,连接就已经建立了。双方可以进行数据传输了。
四次挥手
由于TCP连接是全双工的,因此,每个方向都需要单独进行关闭。这一原则是指当一方完成数据传输任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只意味着这一方向上没有数据传输,但在这个TCP连接上仍然能够发送数据,直到这一方向也发送FIN来。也就是说要同时出现两个FIN才可以结束通信
这四次挥手是:
1、第一次挥手:client发送一个FIN,用来关闭client到server的数据传输,client进入FIN_WAIT_1状态,也就是结束的状态;
2、第二次挥手:server收到FIN后,发送一个ACK给client,确认序号为收到序号+1,server进入CLOSE_WAIT状态,但是这个时候可能server的数据还没有发送完毕,还不能发送FIN信号;
3、第三次挥手:当该有的数据发送完成后,server发送一个FIN,用来关闭server到client的数据传输,server进入LAST_ACK状态;
4、第四次挥手:client收到FIN后,client进入TIME_WAIT状态,接着发送一个ACK给server,确认序号为收到序号+1,server进入CLOSE状态。
3、HTTP的连接特点
HTTP连接最显著的特点是客户端发送的每次请求服务器都需要回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
2)在HTTP> 1.1中,则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。(socket是长连接)
三、TCP/IP
1、TCP
手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。
2、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还是HTTP在连接过程中都需要将通信和连接规则设置好,就好比stm32串口通信,需要双方配置好才能进行通信。
联系
四、socket与tcp
创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。socket则是对TCP/IP协议的封装和应用(程序员层面上)。也可以说,TPC/IP协议是传输层协议,主要解决数据 如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。
归根结底: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编程接口。”
五、Socket与HTTP
1、(socket)长连接与(http)短连接
Socket是长连接:由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开,这称为长连接。
HTTP是短连接:HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。【发送请求 > 回复 > 断开】,这称为短连接。
归根结底:很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
使用场景:
用HTTP的情况:双方不需要时刻保持连接在线,比如客户端资源的获取、文件上传等。
用Socket的情况:大部分即时通讯应用(QQ、微信)、聊天室、苹果APNs等。
六、HTTP与TCP
TPC/IP协议是传输层协议,主要解决数据在网络中如何传输,而HTTP是应用层协议,主要解决如何包装数据。说白了HTTP协议是建立在TCP协议之上的一种应用
“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等。
七、HTTP与TCP与socket
最后我们再来一次总结,如图下所示
HTTP是应用层的协议,更靠近用户端;TCP是传输层的协议;而socket是从传输层上抽象出来的一个抽象层,本质是接口。所以本质上三种还是很好区分的。