9/15/2017 最近在学UNIX网络编程,感觉理论基础不够,所以整理了一遍相关的知识
Socket简介
两个进程能够进行通讯的办法是在网络中唯一的标识一个进程。而在网络中唯一的标识一个进程的方法是:标出ip地址 + 协议 + 端口号。这样就可以利用socket进行通信了。
什么是socket?socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
socket抽象层在网络中的位置图解:
Socket通信流程
·
(绿色为服务器操作,纯黑色为用户操作)
服务器根据地址类型(ipv4、ipv6)、socket类型、协议创建socket
服务器为socket绑定对应的IP地址和端口号
服务器监听端口号请求,接收用户发来的连接请求,此时服务器没有打开socket
· 用户创建socket
用户打开socket,并通过IP地址+端口号试图connect服务器的socket
服务器接收到了用户发来的socket连接请求,被动打开socket,开始接收客户端请求,直到用户返回连接信息。这时候服务器的socket进入堵塞状态,所谓堵塞,即accept();方法一直接收到客户端返回连接信息后才返回,然后开始接收下一个用户端请求
客户端连接成功,开始向服务器输入状态信息
服务器accept();方法返回,连接成功
客户端写入信息
服务器读取信息
客户端关闭
服务端关闭
三次握手
在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接,就是socket通信流程中的建立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状态,完成三次握手