基于TCP的通信

本文深入解析了TCP(传输控制协议)的原理与工作方式,包括其作为面向连接、可靠且基于字节流的传输层协议的角色,以及在OSI模型中的位置。文章详细描述了TCP如何在IP层之上实现数据包的可靠传输,通过序列号和确认机制确保数据的有序接收,同时利用校验和函数检测数据错误。此外,还提供了Python代码示例,展示了如何使用socket模块实现基于TCP的服务端与客户端通信。
摘要由CSDN通过智能技术生成

TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内 [1] 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。 [1] 应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( [1] MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体 [1] 的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

服务端:

import socket
# 1. 创建一个socket对象;
# family指定使用IP协议的版本: IPV4:AF_INET;  ipv6: AF_INET6
# type指定传输层使用的协议类型:TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 2. 绑定一个IP和端口, 供客户端来连接;
server.bind(('172.25.76.250', 4002))
# 3. 监听是否有客户端连接
server.listen(5)
print("服务端正在启动.........")
# 4. 接收客户端的连接, accept() -> (socket object, address info)
clientSocket, address = server.accept()
print("客户端的地址:", address)
# 5. 接收客户端发送的消息
recvData = clientSocket.recv(1024)
print("服务端接收的消息:", recvData.decode('utf-8'))
# 6. 给客户端回复消息, send(self, data: **bytes***, flags: int = ...) -> int: ...
clientSocket.send('你好, 客户端'.encode('utf-8'))
# 7. 关闭服务端socket对象
server.close()
clientSocket.close()

客户端:

import socket
# 1. 创建一个socket对象;
# family指定使用IP协议的版本: IPV4:AF_INET;  ipv6: AF_INET6
# type指定传输层使用的协议类型:TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

# 2. 连接服务端(ip, port)
client.connect(('172.25.76.250', 4002))

# 3. 给服务端回复消息, send(self, data: **bytes***, flags: int = ...) -> int: ...
client.send("你好, 服务端".encode('utf-8'))

# 4. 接收服务端回复的消息
recvData = client.recv(1024)
print("客户端接收的消息:", recvData.decode('utf-8'))

# 7. 关闭客户端socket对象
client.close()

基于TCP的聊天室通信

服务端

import socket
# 1. 创建一个socket对象;
# family指定使用IP协议的版本: IPV4:AF_INET;  ipv6: AF_INET6
# type指定传输层使用的协议类型:TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 2. 绑定一个IP和端口, 供客户端来连接;
server.bind(('172.25.76.250', 4008))
# 3. 监听是否有客户端连接
server.listen(5)
print("服务端正在启动.........")
# 4. 接收客户端的连接, accept() -> (socket object, address info)
clientSocket, address = server.accept()
print("客户端的地址:", clientSocket,address)
while True:
    # 5. 接收客户端发送的消息
    recvData = clientSocket.recv(1024)
    print("服务端接收的消息:", recvData.decode('utf-8'))
    # 6. 给客户端回复消息, send(self, data: **bytes***, flags: int = ...) -> int: ...
    sendData = input('server:>> ')
    if not sendData:
        continue
    if sendData == 'quit':
        print("聊天结束.....")
        break

    clientSocket.send(sendData.encode('utf-8'))
# 7. 关闭服务端socket对象
server.close()
clientSocket.close()

客户端1:

import socket
# 1. 创建一个socket对象;
# family指定使用IP协议的版本: IPV4:AF_INET;  ipv6: AF_INET6
# type指定传输层使用的协议类型:TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

# 2. 连接服务端(ip, port)
client.connect(('172.25.76.250', 4006))
while True:
    # 3. 给服务端回复消息, send(self, data: **bytes***, flags: int = ...) -> int: ...
    sendData = input('client:>> ')
    if not sendData:
        continue
    if sendData == 'quit':
        print("聊天结束.....")
        break

    client.send(sendData.encode('utf-8'))

    # 4. 接收服务端回复的消息
    recvData = client.recv(1024)
    print("客户端接收的消息:", recvData.decode('utf-8'))

# 7. 关闭客户端socket对象
client.close()

客户端二:

import socket
# 1. 创建一个socket对象;
# family指定使用IP协议的版本: IPV4:AF_INET;  ipv6: AF_INET6
# type指定传输层使用的协议类型:TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

# 2. 连接服务端(ip, port)
client.connect(('172.25.76.250', 4008))
while True:
    # 3. 给服务端回复消息, send(self, data: **bytes***, flags: int = ...) -> int: ...
    sendData = input('client:>> ')
    if not sendData:
        continue
    if sendData == 'quit':
        print("聊天结束.....")
        break

    client.send(sendData.encode('utf-8'))

    # 4. 接收服务端回复的消息
    recvData = client.recv(1024)
    print("客户端接收的消息:", recvData.decode('utf-8'))

# 7. 关闭客户端socket对象
client.close()

TCP的工作方式

在这里插入图片描述

TCP的工作方式

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值