Socket基础
TCP与Socket
TCP:是一种面向连接的,可靠的,基于字节流的的传输层通信协议。
Socket:也称为“套接字”,它是应用程序通过网络发送请求和接受应答的接口。
OSI七层模型和TCP/IP四层模型
OSI七层模型 |
TCP/IP四层模型 |
对应的网络协议或应用 |
应用层 |
应用层 |
HTTP,TFTP,FTP,NFS,WAIS |
表示层 |
Telnet,SNMP,Gopher |
|
会话层 |
SMTP,DNS |
|
传输层 |
传输层 |
TCP,UDP |
网络层 |
网际层 |
IP,ICMP,ARP,RARP,AKP,UUCP |
数据链路层 |
网络接口层 |
FDDI,Ethernet,ARPANET,PDN,SLIP,PPP |
物理层 |
IEEE 802.1~ IEEE 802.11 |
TCP通信过程
1.TCP建立连接过程,俗称三次握手:
(1) 客户端先向服务端发送SYN包(Socket状态从CLOESD变为SYN-SEND)。
(2) 服务端收到此SYN包后 (Socket状态从LISTEN变为SYN-RECV),并且向客户端发送针对次SYN包的SYN/ACK包,以确认收到这个SYN包
(3) 客户端收到此SYN/ACK包后(Socket状态从SYN-SEND变为ESTABLISED),再向服务端发送针对此SYN/ACK包的ACK包
(4) 服务端收到ACK包后(Socket状态从SYN-RECV变为ESTABLISED),连接建立成功,双方可以开始手法数据。
2.TCP半连接:指TCP建立连接过程中,没有完全建立的连接被称为“半连接”;
3.全双工异步通信:
(1) TCP和UDP都是全双工协议。全双工指建立连接后,数据的发送和接受能同时进行。
(2) 全双工的不足:如果数据的发送和接受都由一个线程来完成,那么发送数据时则无法接收数据,接收数据时,无法发送数据
(3) 优化全双工不足的方案:数据的的发送单独一个线程处理,数据的接收单独一个线程处理,这样数据的发送和接收就能互不影响。该模型也成为全双工异步通信模型。
(4)全双工异步通信模型的关键:需要将请求和响应一一对应上,通常的做法是将请求和响应编号。比如请求线程编号为1.0.0,该请求的响应编号为1.0.1,那么接收线程在接受到1.0.1编号的响应,就能找到是求线程编号为1.0.0的响应。
4.断开连接
TCP断开连接的过程,俗称四次挥手:
(1) 客户端向服务端发送FIN包,表示想断开连接。Socket状态从ESTABLISED状态变为FIN_WAIT_1。
(2) 服务端收到此FIN包后,向客户端发送ACK包,表示准备断开中(需要检查是否可以断开)。Socket状态从ESTABLISED状态变为CLOSED_WAIT。
(3) 客户端收到ACK包后,Socket状态从FIN_WAIT_1状态变为FIN_WAIT_2,等待服务端发送断开连接的数据包。
(4) 服务端在准备完毕后向客户端发送FIN包,确认可以断开连接,Socket状态从CLOSED_WAIT状态变为LAST_ACK,等待客户端确认。
(5) 客户端收到服务端的FIN包后,向服务端发送ACK包,确认可以断开连接。Socket状态从FIN_WAIT_2状态变为TIME_WAIT。
(6) 服务端收到客户端的ACK包后,断开连接,关闭套接字,Socket状态变为CLOSED。
(7) 客户端等到一段时间后,才真正关闭连接,Socket状态从TIME_WAIT状态变为CLOSED。
步骤(5)有可能因为网络问题,导致客户端发送的ACK包丢失,从而导致服务端将重发FIN包,如果客户端在发送ACK包后,马上关闭连接,导致将收不到服务端重发的包,所以客户端需要等待状态。
5.半开连接
TCP连接的一端异常奔溃,例如断电等,导致没有通知对方就关闭连接,该情况数据不能正常收发,但是另一端会一直处于ESTABLISED状态,Socket不能及时释放,浪费对端可用的文件描述符资源。
6.半连接
处于三次握手过程中,没有完全建立好的连接被称为半连接。