socket通信理解

什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

http请求底层也是基于socket的。 另外Socket也就是我们通常说的TCP的封装形式。

socket通信流程:

socket是"打开—读/写—关闭"模式的实现,以使用TCP协议通讯的socket为例:
 

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

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

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

客户端创建socket

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

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

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

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

客户端向socket写入信息

服务器读取信息

客户端关闭

服务器端关闭

三次握手

第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认

第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态

第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手

定睛一看,服务器socket与客户端socket建立连接的部分其实就是大名鼎鼎的三次握手


Socket与服务端ServerSocket建立联系的三次握手过程:

(1)第一次握手:建立连接时,客户端Socket向服务端ServerSocket发送SYN包,并进入SYN_SEND状态,等待服务器B确认。这个过程,就好比我向你打电话,我的手机号通过信号到了你的手机上并显示 156XXXXXXXX来电,此时要等你确认这个手机号。

(2)第二次握手:此时服务端收到客户端的SYN包,与客户端的SYN进行确认,确认后,服务端向客户端发送个SYN包,即SYN+ACK 包。服务端进入SYN_RECV状态。这个过程就好比,当收到某人的来电后,我确认手机号是我的朋友,此时我要接通他的电话。

(3)第三次握手:客户端收到服务端发送过来的SYN + ACK包,此时客户端像服务端再发送一个ACK确认包。此时发送完毕后,客户端与服务端就进入了ESTABLISHED状态,完成通信前的三次握手。这个过程就好比,当我接通了电话后,我问对方是XXX吗?对方说是的!(妈的,终于可以交流了。。。)


 

猜你喜欢

转载自572327713.iteye.com/blog/2338827
今日推荐