0. TCP和Socket的定义
什么是TCP?
Transmission Control Protocol - 传输控制协议,是一种面向连接的,可靠的,基于字节流的传输层通信协议。
这里需要记住的是:TCP是传输层的,它是一种通信协议。
TCP和UDP一样,同属于OSI七层网络模型的第四层,即传输层。
OSI网络模型:
应用层 - 【HTTP, FTP, NFS ...】
表示层 - 【Telnet,SNMP,Gopher】
会话层 - 【SMTP,DNS】
传输层 - 【TCP,UDP】
网络层 - 【IP,ICMP,ARP ...】
数据链路层 - 【Ethernet,ARPANET ...】
物理层 - 【IEEE 802.1 - 802.11】
什么是Socket?
Socket即套接字。
它是应用程序通过网络发送请求和接受应答的接口。
1. TCP的通信过程
TCP的通信过程和打电话基本相同。
一方负责接听某个特定号码的电话;另一方则需要拨通这个号码,即与对方建立通信连接。
在这个过程中,
听筒即Socket输入流,它负责接收对方的信息。
话筒即Socket输出流,它负责向对方发送信息。
整个通信的过程中,信息的接收和发送是同时进行的,即双工通信。
TCP通信过程
2. 建立连接的3次握手
TCP建立连接需要3次握手。
它和如下的打电话场景类似:
A: 喂,你好,听得到吗?
B: 喂, 你好,听得到。你听得到我说话吗?
A: 嗯,听得到。
TCP的3次握手过程如下:
- 客户端先向服务端发送SYN包,Socket状态从CLOSED变为SYN-SEND。
- 服务端接收到SYN包后,Socket状态从LISTEN变为SYN_RECV,同时向客户端发送SYN/ACK包来确认收到了刚才的SYN包。
- 客户端收到了SYN/ACK包后,将Socket状态从SYN-SEND变为ESTABLISHED,再向服务端发送ACK包。
- 服务端手动ACK包以后,Socket状态从SYN-RECV改为ESTABLISHED,连接建立成功,双方可以开始收发数据。
3. 断开连接和优雅断开
有建立连接必然就有断开连接。
断开连接和建立连接一样非常重要,如果处理不当,不仅可能造成数据传输失败,还可能导致Socket不能关闭,资源无法释放等问题。
优雅断开是指,一方在传输完成后,通知对方,自己的传输已经完成,不会再发起新的传输,但仍然接收对方发来的数据,直到对方也通知自己,传输已完成,不会再发送新的传输,这时候连接主动断开。
4. 长连接与短连接
什么是短连接?
每次传输前建立连接,传输完成后关闭连接,这种方式被称为短连接。
注:HTTP 1.x协议就是基于TCP短连接的超文本传输协议。
什么是长连接?
在客户端和服务端之间建立一个长期的连接,在其上进行多次通信,直到双方不再需要通信,或其中一方退出时才断开连接,这种方式称为长连接。
注: FTP协议就是基于TCP长连接的文件传输协议。
在客户端需要频繁地与服务端通信的场景下,我们需要使用长连接。
5. 常见的实现长连接的机制
使用Netty可以实现长连接。
(注: 关于Netty请查看另外的单独专题)
Netty创建长连接的基本步骤如下:
1. 创建连接(Channel)
2. 发心跳包
3. 发消息,并通知其他用户
4. 一段时间没收到心跳包或者用户主动关闭之后关闭连接
网友评论