TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过以下步骤进行通信:
建立连接
三次握手:
客户端发送一个SYN(同步)报文给服务器,表示请求建立连接。客户端进入SYN_SEND状态,等待服务器的确认。
服务器收到SYN报文后,发送一个SYN+ACK(同步确认)报文给客户端,表示已经准备好建立连接。服务器进入SYN_RECV状态。
客户端收到SYN+ACK报文后,发送一个ACK(确认)报文给服务器,表示连接已经建立。客户端和服务器都进入ESTABLISHED状态,连接建立完成。
传输数据
全双工通信:连接建立成功后,客户端和服务器可以在同一时刻双向传输数据。
数据发送:
客户端调用write()函数向服务器发送数据。
服务器调用read()函数等待并接收数据。
数据接收:
服务器调用write()函数将数据发送给客户端。
客户端调用read()函数接收数据并处理。
释放连接
四次挥手:
客户端完成数据传输后,发送一个FIN(结束)报文给服务器,表示请求关闭连接。客户端进入FIN_WAIT_1状态。
服务器收到FIN报文后,发送一个ACK(确认)报文给客户端,表示已经收到关闭请求。服务器进入CLOSE_WAIT状态。
服务器完成数据传输后,发送一个FIN报文给客户端,表示服务器也请求关闭连接。服务器进入LAST_ACK状态。
客户端收到服务器的FIN报文后,发送一个ACK报文给服务器,表示已经收到关闭请求。客户端进入TIME_WAIT状态,等待一段时间以确保服务器收到ACK。
示例代码
服务器端代码:
```python
import socket
创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
绑定IP和端口
server_socket.bind(('127.0.0.1', 12345))
监听连接
server_socket.listen(5)
print('Server is listening...')
接受客户端连接
client_socket, addr = server_socket.accept()
print(f'Got connection from {addr}')
接收数据
data = client_socket.recv(1024)
print(f'Received: {data.decode()}')
发送数据
client_socket.send(b'Hello from server!')
关闭连接
client_socket.close()
server_socket.close()
```
客户端代码:
```python
import socket
创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
连接服务器
client_socket.connect(('127.0.0.1', 12345))
发送数据
client_socket.send(b'Hello from client!')
接收数据
data = client_socket.recv(1024)
print(f'Received: {data.decode()}')
关闭连接
client_socket.close()
```
通过上述步骤和示例代码,TCP协议能够实现客户端和服务器之间的可靠通信。