理解套接字Socket

Posted kumata

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解套接字Socket相关的知识,希望对你有一定的参考价值。

Socket

在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。

技术分享图片

 

需要记住的知识点:

  • 监听的 Socket 和真正用来传数据的 Socket 是两个,一个叫作监听 Socket,一个叫作已连接 Socket。
  •  TCP 和 UDP 的 Socket 的编程中,客户端和服务端都需要调用哪些函数

基于 TCP 协议的 Socket 程序函数调用过程(Socket通信流程)

socket是"打开—读/写—关闭"模式的实现,以使用TCP协议通讯的socket为例,其交互流程大概是这样子的

技术分享图片

服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket

服务器为socket绑定ip地址和端口号

服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开

客户端创建socket

客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket

服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求

客户端连接成功,向服务器发送连接状态信息

服务器accept方法返回,连接成功

客户端向socket写入信息

服务器读取信息

客户端关闭

服务器端关闭

对于tcp的三次握手,咋一看Socket刚好为之对应

技术分享图片

 

 

基于 UDP 协议的 Socket 程序函数调用过程

对于 UDP 来讲,过程有些不一样。UDP 是没有连接的,所以不需要三次握手,也就不需要调用 listen 和 connect,但是,UDP 的的交互仍然需要 IP 和端口号,因而也需要 bind。

UDP 是没有维护连接状态的,因而不需要每对连接建立一组 Socket,而是只要有一个 Socket,就能够和多个客户端通信。也正是因为没有连接状态,每次通信的时候,都调用 sendto 和 recvfrom,都可以传入 IP 地址和端口。

技术分享图片

 

以上是关于理解套接字Socket的主要内容,如果未能解决你的问题,请参考以下文章

Java中套接字的理解

PHP Socket 帮助理解

2-5:套接字(Socket)编程之从内核角度深入理解套接字

Python中网络编程对socket accept函数的理解

简单socket服务器的基本理解

Socket 套接字