Num01-->TCP通信模型
这里写图片描述
Test01-->TCP客户端案例
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
from socket import *
def main():
# 1.创建socket
client_socket = socket(AF_INET, SOCK_STREAM)
# 2.指定服务器的地址和端口号
server_addr = ('192.168.105.125',8080)
client_socket.connect(server_addr)
print('connect %s success' % str(server_addr))
while True:
# 3.给用户提示,让用户输入要检索的资料
send_data = input('>>')
# 退出
if send_data == 'quit':
break
# 向服务器请求数据
client_socket.send(send_data.encode())
client_socket.close()
if __name__ == "__main__":
main()
Test02-->TCP服务器端案例
TCP服务器端创建流程如下:
1,socket创建一个套接字
2,bind绑定ip和port
3,listen使套接字变为可以被动链接
4,accept等待客户端的链接
5,recv/send接收/发送数据
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
from socket import *
import time
def main():
# 1.创建socket,stream流式套接字,对应tcp
listen_socket = socket(AF_INET, SOCK_STREAM)
# 设置允许复用地址,当建立连接之后服务器先关闭,设置地址复用
# 设置socket层属性 复用地址 允许
listen_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 2.绑定端口号
my_addr = ('192.168.105.125', 8080)
#shift + insert
listen_socket.bind(my_addr)
# 3.接听状态
#listen中的black表示已经建立链接和半链接的总数
#如果当前已建立链接数和半链接数以达到设定值,那么新客户端就不会connect成功,而是等待服务器。直到有链接退出。
listen_socket.listen(4)
print('listening...')
# 4.等待客户端来请求服务器
while True:
# 接受连接请求,创建新的连接套接字,用于客户端连通信
connect_socket, client_addr = listen_socket.accept()
# accept默认会引起阻塞
# 新创建连接用的socket, 客户端的地址
# print(connect_socket)
# print(client_addr)
while True:
# tcp recv() 只会返回接收到的数据
# 1024表示接受的数据长度
recv_data = connect_socket.recv(1024)
if len(recv_data) == 0:
#发送方关闭tcp的连接,recv()不会阻塞,而是直接返回''
print('client %s close' % str(client_addr))
time.sleep(5)
break
print('recv: %s' % recv_data.decode('gbk'))
# 用完之后,关闭新创建的那个connect_socket
connect_socket.close()
if __name__ == "__main__":
main()
Num02-->TCP协议三次握手
这里写图片描述
Num03-->TCP协议四次挥手
这里写图片描述
Num04-->TCP协议十种状态
这里写图片描述
当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送
发送FIN通常是应用层对socket进行关闭的结果
Num05-->TCP协议的2MSL问题
这里写图片描述
加以说明:
1,2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态。
2,当TCP的一端发起主动关闭,在发出最后一个ACK包后,
3,即第3次握 手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,
4,必须在此状态上停留两倍的MSL时间,
5,等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,
6,那么对方在超时后将重发第三次握手的FIN包,
7,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。
8,在TIME_WAIT状态 时两端的端口不能使用,要等到2MSL时间结束才可继续使用。
9,当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。
10,不过在实际应用中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。
Num06-->TCP协议长链接和短链接
TCP在真正的读写操作之前,se