【计算机网络】一篇文章快速了解Socket

目录

一、socket简介

二、socket通信流程

三、socket和http

3.1 socket和http的区别

3.2 socket和http的应用场景有哪些


一、socket简介

端口(port)是伴随着传输层诞生的概念。它可以将网络层的IP通信分送到各个通信通道。UDP协议和TCP协议尽管在工作方式上有很大的不同,但它们都建立了从一个端口到另一个端口的通信。

随着我们进入传输层,我们也可以调用操作系统中的API,来构建socket(套接字)

 

Socket是操作系统提供的一个编程接口,它用来代表某个网络通信。应用程序通过socket来调用系统内核中处理网络协议的模块,而这些内核模块会负责具体的网络协议的实施。这样,我们可以让内核来接收网络协议的细节,而我们只需要提供所要传输的内容就可以了,内核会帮我们控制格式,并进一步向底层封装。

 

Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。例如服务器和客户端通过socket进行交互。服务器需要绑定在本机的某个端口号上,客户端需要声明自己连接哪个地址的哪个端口,这样服务器和客户端就能连接了。

 

生成套接字,主要有3个参数:通信的目的IP地址使用的传输层协议(TCPUDP)使用的端口号。Socket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输 层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

 

因此,在实际应用中,我们并不需要知道具体怎么构成一个UDP包,而只需要提供相关信息(IP地址,端口号,所要传输的信息等)来创建socket,然后socket就会借助操作系统内核在传输之前会根据我们提供的相关信息构成一个合格的UDP包(以及下层的包和帧)。

 

二、socket通信流程

Host A上的程序A将一段信息写入Socket中,Socket的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。

要通过互联网进行通信,至少需要一对套接字,一个套接字运行客户机端,称之为ClientSocket,另一个套接字运行服务器端,称之为serverSocket。     

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听客户端请求连接确认。     

  • 服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
  • 客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
  • 连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客 户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

socket通信步骤:

  1. 服务器根据地址类型(ipv4,ipv6)、socket类型、协议类型(UDP/TCP)来创建socket
  2. 服务器为socket绑定ip地址和端口号
  3. 服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
  4. 客户端创建socket
  5. 客户端打开socket,根据服务器ip地址和端口号使用connexct()方法试图连接服务器socket
  6. 服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候服务器socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端连接请求
  7. 客户端连接成功,向服务器发送连接状态信息
  8. 服务器accept()方法返回,连接成功
  9. 客户端send()方法向socket写入信息
  10. 服务器recv()方法读取信息
  11. 客户端关闭
  12. 服务器端关闭

由上面的过程我们可以发现,socket就是对TCP/IP协议的封装和应用。在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接。

  1. 第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认。
  2. 第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
  3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

服务器socket与客户端socket建立连接的部分其实就是“三次握手”。

 

三、sockethttp

3.1 sockethttp的区别

socket连接:

socket不属于协议范畴,而是一个调用接口(API),是对TCP/IP协议的封装。实现服务器与客户端之间的物理连接,并进行数据传输。Socket处于网络协议的传输层,主要有TCP/UDP两个协议(当然也有TCP/IP协议族中其他的协议)。

socket连接是长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会使连接断开,比如:服务器端或客户端主机宕机了、网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。所以当一个socket连接中没有数据的传输,那么为了维持连接需要发送心跳消息。

socket传输的数据可自定义,为字节级,数据量小,可以加密,数据安全性高,适合Client/Server之间信息实时交互。

 

http连接:

HTTP是基于TCP/IP协议的应用层协议,定义的是传输数据的内容的规范。

HTTP是基于请求-响应形式并且是短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉。

HTTP是无状态的协议,针对其无状态特性,在实际应用中又需要有状态的形式,因此一般会通过session/cookie技术来解决此问题。

HTTP的传输速度慢,数据包大,数据传输安全性差,如实现实时交互,服务器性能压力大。

 

3.2 sockethttp的应用场景有哪些

socket一般用于比较即时的通信和实时性较高的情况,比如推送,聊天,保持心跳长连接等;

http一般用于实时性要求不那么高的情况,比如信息反馈,图片上传,获取新闻信息等。

 

某些场合使用http不使用socket的原因是socket一旦连接上了,就一直保持连接,就会造成阻塞IO,与此相对的的,还有非阻塞IO。

  • 阻塞IO是指客户端请求服务器端,服务器端处理完成后,再将返回值给客户端。此时客户端一直处在阻塞状态。当客户端太多、同时并发请求的时候,服务器端处理不过来,服务端就会一直卡在那里等待,影响用户体验。因此提出了非阻塞IO。
  • 非阻塞IO是指客户端请求服务器端,服务器端有一些监听器负责接受请求,接收到客户端发来的请求之后立即返回,即告诉客户端已经接受好了,等处理完成后再把数据返回客户端,在服务端处理数据期间客户端不会一直阻塞等待。

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。


 参考资料:https://www.linuxidc.com/Linux/2018-09/154366.htm
                   https://blog.csdn.net/weixin_36691991/article/details/104963784?fps=1&locationNum=2

发布了54 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/cy973071263/article/details/105128839