Network Programming 
Internet Protocol Suite 
- TCP/IP
 - UDP
 
IP协议
按块发送
IPv4: 32位整数
IPv6: 128位整数
TCP协议
一种可靠连接,建立在IP协议之上,负责建立连接,保证数据包按顺序到达
报文包含
- 源IP地址
 - 目标IP地址
 - 源端口
 - 目标端口
 
UDP协议
不可靠连接,速度快
TCP 编程 
Client <=> Server
Client 
python
# 创建socket
s = socket.socket(
	socket.AF_INET,      # IPv4协议,AF_INET6是IPv6
    socket.SOCK_STREAM   # 数据流
)
# 建立连接
s.connect(
	('<ip_address>', 80) # IP地址和端口号
)
# 发送数据
s.send(
	b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n'
)
# 接收数据
buffer = []
while True:
    d = s.recv(
    	1024             # 每次最多接收1k字节
    )
    if d:
        buffer.append(d)
    else:
        break
data = b''.join(buffer)
# 关闭socket
s.close()
# 接收数据处理
header, html = data.split(b'\r\n\r\n', 1)
with open('index.html', 'wb') as f:
    f.write(html)Server 
python
# 创建socket
s = socket.socket(
	socket.AF_INET,      # IPv4协议,AF_INET6是IPv6
    socket.SOCK_STREAM   # 数据流
)
# 监听端口
def tcplink(sock, addr):
    sock.send(b'Welcome!')
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if not data or data.decode('utf-8') == 'exit':
            break
        sock.send(('Hello, %s!' % data.decode('utf-8')))
    sock.close()
    print('Connection from %s:%s closed' % addr)
s.bind(
	('127.0.0.1', 88)
)
s.listen(5)              # 等待连接的最大数量
while True:
    sock, addr = s.accept()
    t = threading.Thread(
    	target = tcplink,
        args=(sock, addr)
    )
    t.start()UDP 编程 
Client 
不需要connect,只需要sendto
python
s.sendto(
	b'Hello, %s!' % data,
    addr
)Server 
python
s = socket.socket(
	socket.AF_INET,      # IPv4协议,AF_INET6是IPv6
	socket.SOCK_DGRAM    # UDP类型
)