网络编程TCP协议(python中运用)

网络编程TCP协议(python中运用)

1.1 TCP概述
TCP:英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议.

1.2 TCP特点
TCP是面向连接,是一对一的,不适用广播应用程序,传输可靠(有应答机制,超时重传,数据校验,流量控制等特点)
优点:1.传输可靠,稳定
2.适合传输大量数据
缺点:1.传输速度慢
2.占用系统资源高

1.3 TCP和UDP的区别
1.TCP是面向连接的,UDP是不面向连接的;
2.TCP数据传输可靠(因为有连接),通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP不保证可靠的数据传输,容易出现丢包情况;
3.TCP有流量控制,UDP没有流量控制;
4.TCP适合发送大量数据,UDP适合发送小量数据(每个数据包最大64k);
5.TCP占用系统资源高,UDP占用系统资源少;
6.TCP传输速度慢(因为需要连接),UDP传输速度快(因为不需要连接);
7.TCP不支持发广播,UDP支持发广播。

2.1 socket介绍
1.socket(简称 套接字) 是进程间通信一个工具,它能实现把数据从一方传输到另外一方,完成不同电脑上进程之间的通信, 它好比数据的搬运工。
2.简单来说socket就 是用来实现不同进程之间通信的工具.

2.2 创建socket
在 Python 中 使用socket 模块的函数 socket 就可以完成:

import socket
socket.socket(AddressFamily, Type)

说明:
函数 socket.socket 创建一个 socket,该函数带有两个参数:
Address Family:IP地址类型; AF_INET表示ipv4类型、AF_INET6表示ipv6类型; Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)

2.3创建一个TCP socket(TCP套接字)
TCP的客户端

import socket

# 创建tcp socket
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 目的信息
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))

# 链接服务器
tcp_client_socket.connect((server_ip, server_port))

# 提示用户输入数据并编码(encode('utf-8'))
send_data = input("请输入要发送的数据:")

tcp_client_socket.send(send_data.encode('utf-8'))

# 接收对方发送过来的数据,最大接收1024个字节并解码(decode(‘utf-8’))
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode('utf-8'))

# 关闭套接字
tcp_client_socket.close()

2.4 TCP服务器端

import socket

# 创建socket
tcp_server_socket = socket(socket.AF_INET, socket.SOCK_STREAM)

# 设置socket选项,让端口立即释放(可以让端口号复用)
tcp_client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

# 本地信息(IP不写默认为0.0.0.0可以同时接受外网和内网的请求,端口号写任意动态端口号即(1024~65535之间))
address = ('', 动态端口号)

# 绑定
tcp_server_socket.bind(address)


# 设置监听
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
# 128:表示最大等待连接数(以前内存小,现在默认接收最大连接数为内存大小,象征意义所以默认写128)
tcp_server_socket.listen(128)

# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接(clientAddr为客户端的IP地址,client_socket有客户端的所有信息)
client_socket, clientAddr = tcp_server_socket.accept()

# 接收对方发送过来的数据
recv_data = client_socket.recv(1024)  # 接收1024个字节
print('接收到的数据为:', recv_data.decode('utf-8'))

# 发送一些数据到客户端
client_socket.send("thank you !".encode('utf-8'))

# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()

2.5 TCP的三次握手
TCP三次握手流程图:
网络编程TCP协议(python中运用)
标志位:SYN: 表示连接请求 ACK: 表示确认 seq:表示报文序号 ack: 表示确认序号
个人理解:简单来说就是客户端发出SYN连接请求,服务器返回ACK应答并且有新的SYN请求,然后客户端返回ACK应答给服务器。(seq,ack这些报文的值J,K是随机变量,用来验证准确性)

2.6 TCP的四次挥手
TCP的四次挥手流程图:
网络编程TCP协议(python中运用)
标志位:ACK: 表示确认 FIN: 表示关闭连接
个人理解:客户端发出断开连接请求FIN,然后服务器给出ACK应答给服务器,服务器也向客户端发出断开连接请求FIN,然后客户端向服务器返回ACK应答。
关键:客户端与服务器端都进行了一次确认

刚开始学习不久的python小白,大部分都是个人的一些理解,不喜勿喷。