Jamal的博客

tcp握手和socket通信细节

socket的为网络通信协议提供了编程接口,socket就是不同计算机之间进行通信的一个抽象。普通的cs通信过程模型:


server的生命周期:

1
2
3
4
5
1. 创建socket
2. bind地址端口
3. 监听网络连接
4. 接受连接
5. 关闭连接

client简单一些:

1
2
3
4
1. 创建socket
2. 绑定地址
3. 发起连接
4. 关闭连接

从代码说起:
client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import socket
address = ('127.0.0.1', 8000)
# 创建 tcp socket
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 发起连接
client.connect(address)
# 发送数据
client.send('hello-world')
# 接受数据
data = client.recv(1024)
print data
# 关闭连接
client.close()

server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import socket
address = ('127.0.0.1', 8000)
# 创建 tcp socket
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定地址
server.bind(address)
# 监听
server.listen(5)
while True:
# 获取连接
conn, addr = server.accept()
while True:
# 读取数据
data = conn.recv(1024)
# 发送数据给客户端
conn.sendall(data)
if not data:
# 关闭连接
conn.close()
break
# 关闭socket
server.close()

其中握手的连接发生在client的connect中,server端accept返回连接,server端实际的建连过程发生listen过程,accept只是返回了队列中的一个连接,下图是一个更细的示意图: