Linux 套接字(Socket)

前言
“IP地址+网络协议+端口”的整合就称为套接字(Socket)
目录
一、描述
二、连接过程
三、总结
四、补充
五、思维导图
一、描述
1、套接字(Socket):
- “IP地址+网络协议+端口”的整合;
- 可以说,套接字就是在纵横交错的网络通信中,区分不同应用程序进程间的网络通信和连接的一套关键字。
套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行,Linux所提供的功能(如:打印服务,ftp等)通常都是通过套接字来进行通信的,套接字的创建和使用与管道是有区别的,因为套接字明确地将客户服务器区分出来,套接字可以实现将多个客户连接到一个服务器。
2、套接字(Socket)包含了进行网络通信必须的五种信息:
- 连接使用的协议
- 本地主机的IP地址
- 本地进程的协议端口
- 远程主机的IP地址
- 远程进程的协议端口
二、连接过程
1、服务器监听:
- 是指服务端套接字并不定位具体的客户端套接字,而是出于等待连接的状态,实时监控网络状态;
- 服务端会创建一个可用的套接字,用到domain, type, protocol;
- 调用bind函数把套接字和套接字地址绑定;
- 其中有一个listen函数,初始化创建的套接字,可以认为是一个“主动”套接字;
- 连接建立之后,操作系统内核和应用程序之间的桥梁会用到accept函数。
2、客户端请求:
- 是由客户端的套接字提出连接请求,要连接的目标是服务端套接字;
- 会用到connect函数完成,需要用到的参数有:连接套接字、套接字地址结构的指针、套接字地址结构的大小。
3、连接确认:
- 是当服务器端套接字监听到或者说接收到客户端套接字的连接请求时;
- 它就相应客户端套接字的请求,建立一个新的线程;
- 把服务端套接字的信息发送给客户端;
- 一旦客户端确认此连接,连接即可建立。
三、总结
- 套接字(Socket):“IP地址+网络协议+端口”的整合就称为套接字(Socket)。可以说,套接字就是在纵横交错的网络通信中,区分不同应用程序进程间的网络通信和连接的一套关键字。
- 套接字(Socket)包含了进行网络通信必须的五种信息。
- 套接字之间的连接过程可以分为以下三个步骤:服务器监听、客户端请求、连接确认。
- 服务器通过创建socket,bind,listen完成初始化,通过accept完成连接建立。
- 客户端通过创建socket,connect发起连接建立请求。
四、补充
如果是TCP套接字,那么调用connect函数将激发TCP的三次握手过程,而且仅在连接建立成功或出错时才返回。
其中出错返回可能有以下几种情况:
- 客户端发出的SYN没有任何响应,返回TIMEOUT错误:常见于对应的服务端IP写错。
- 客户端收到RST回答,这时客户端立即返回CONNECTION REFUSED错误:常见于客户端发送链接请求时的请求端口写错。
- 客户端发出的SYN包在网络上引起“destination unreachable”,即目的不可达:常见于客户端和服务器之间路由不通。
五、思维导图
