Python 网络编程2 TCP

TCP协议全称: 传输控制协议, 顾名思义, 就是要对数据的传输进行一定的控制

TCP协议的特点:
(1)相对于传输层的UDP协议,TCP协议的特点是面向连接的、可靠的传输和字节流。
(2)使用TCP协议通信的双方必须首先建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上的数据传输。TCP是全双工通信,即双方的数据读写可以通过一个连接进行。完成数据交换后,通信双方必须断开连接以释放系统资源。
(3)TCP是端对端的,所以基于广播和多播的应用程序不能使用TCP服务,而无连接的UDP协议则非常适合于广播和多播。

这里写图片描述

tcp客户端

from socket import *

# 1、创建套接字
tcp_socket = socket.socket(AF_INET,SOCK_STREAM)

# 2、获取ip和port
user_ip = input('请输入ip:')
user_port = int(input('请输入端口:'))

# 3、连接服务器
tcp_socket.connect(user_ip,user_port)

# 4、提示用户发送数据
send_data = input('请输入发送的数据:')
tcp_socket.send(send_data.encode('utf-8'))

# 5、接收对方发来的数据
recv_data = tcp_socket.recv(1024)

print('接收到的数据为:',recv_data.decode('utf-8'))

# 关闭套接字
tcp_socket.close()

tcp服务端

TCP服务器端创建流程如下:

1,socket创建一个套接字
2,bind绑定ip和port
3,listen使套接字变为可以被动链接
4,accept等待客户端的链接
5,recv/send接收/发送数据
from socket import *

# 1、创建套接字
tcp_socket = socket.socket(AF_INET,SOCK_STREAM)

# 2、绑定ip和port
tcp_socket.bind = (('',7788))

# 3、listen 使套接字变为被动套接字
tcp_socket.listen(128)

# 4、accept  建立连接
client_socket,client_socket = tcp_socket.accept()

#5  接收和发送数据
recv_data = client_socket.recv(1024)
print('接收到的数据为:',recv_data.decode('utf-8'))
client_socket.send('调查的城市'.encode('utf-8'))
#  6、关闭客户端
client_socket.close()

tcp协议的三次握手
这里写图片描述

tcp协议的四次挥手
这里写图片描述

x,,y都表示32位的随机数
SYN标志:表示发起连接请求
ACK标志:表示应答请求
seq发送方的顺序编号
ack应答方的应答编号=上一次seq编号+这次发送数据长度len
注意:数据长度len,在三次握手和四次挥手的过程中都为0,只在数据传输的时候,有实际的长度

在数据传输的时候,加以说明:
客户端发送SYN seq=x+1,假设数据长度len=10
服务器应答ACK ack=x+1+10
如果客户端再发送请求,那么就重复以上的两步SYN和ACK

FIN表示断开连接请求

FIN和SYN都会占用一个序列长度

问题一:为什么握手三次,而挥手四次?

原因就是三次握手的时候,在没有真正建立连接(三次握手结束)之前是不能发送应用数据的,服务器返回的时候,应答包和请求包是一个包。

而四次挥手是:当一个客户端主动发送断开close()请求时,服务器端却可以接收别的请求;要想真正的结束,那么服务器端就需要被动的调用断开close()。那么服务器返回的时候,ACK(应答包)和FIN(断开连接包)是不同的两个包。所以,需要四次挥手。

问题二:握手为什么是三次?两次行不行?为什么?

三次握手是为了安全,正确考虑,防止大部分的恶意攻击请求。

两次握手不行,因为如果有恶意的、不停的发请求,那么服务器每一次就认为是正确的请求;这样,由于服务器连接的请求数是一定的,那么这些恶意的请求会一直占服务器,会导致正常的用户连接不上服务器,长时间服务器就瘫痪了。

猜你喜欢

转载自blog.csdn.net/qq_41208705/article/details/81782275
今日推荐