TCP/UDP学习(一)
文章目录
- TCP/UDP学习(一)
- 前言
- 一、UDP
-
- 1.使用python创建UDP套接字的步骤
- 2.代码示例
- 二、TCP
-
- 1.使用python创建TCP套接字的步骤
- 2.代码示例
- 三、问题与解决方法
-
- 1、UDP
- 2、TCP
- 总结
- 参考
前言
巩固学习的知识。
一、UDP
UDP全称User Datagram Protocol,即用户数据报协议,是一种面向无连接的协议,作用在OSI模型中的传输层。
1.使用python创建UDP套接字的步骤
- 创建套接字
- 绑定本地的相关信息
- 等待接收对方发送过来的数据
- 显示接收的数据
- 关闭套接字
2.代码示例
udp服务器端代码示例:
import socket
def main():
# 1.创建套接字
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.绑定套接字
udp_server_ip = input('绑定的IP地址:')
udp_server_port = int(input('绑定的端口:'))
udp_server_addr = (udp_server_ip, udp_server_port)
udp_server.bind(udp_server_addr)
# 3.发送/接收消息
recv_data = udp_server.recvfrom(1024)
# 4.打印接收到的信息
print(recv_data[0], recv_data[1])
print('服务器接收到的消息:[%s:%s] : %s' % (recv_data[1][0], recv_data[0][1], recv_data[0].decode('gbk')))
# 5.关闭套接字
udp_server.close()
if __name__ == '__main__':
main()
udp客户端代码示例:
import socket
def main():
# 1.创建socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.发送信息到远端
send_msg = input('客户端需要发送的消息:')
udp_server_ip = input('服务器ip地址:')
udp_server_port = int(input('服务器端口地址:'))
udp_server_addr = (udp_server_ip, udp_server_port)
udp_socket.sendto(send_msg.encode('utf-8'), udp_server_addr)
# 3.关闭socket
udp_socket.close()
if __name__ == '__main__':
main()
二、TCP
TCP全称Transmission Control Protocol,即传输控制协议,是一种面向连接的、可靠的、基于字节流的协议,作用在OSI模型中的传输层。
1.使用python创建TCP套接字的步骤
客户端:
- 创建套接字
- 链接服务器
- 发送/接收消息
- 关闭 套接字
服务器端:
- 创建套接字
- 绑定服务器IP地址和端口
- 监听
- 等待连接
- 接收/发送消息
- 关闭套接字
2.代码示例
tcp服务器端代码示例:
import socket
def main():
# 1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.绑定服务器端IP地址和端口
server_ip = input('输入服务器端IP地址:')
server_port = int(input('输入服务器端port:'))
tcp_server_socket.bind((server_ip, server_port))
# 3.监听
tcp_server_socket.listen(128)
# 4.等待连接
new_client_socket, client_info = tcp_server_socket.accept()
# 5.接收/发送消息
recv_data = new_client_socket.recv(1024)
print('接收到客户端[%s]发送的消息:%s' % (client_info, recv_data.decode('utf-8')))
send_data = input('回送给客户端的消息:')
new_client_socket.send(send_data.encode('utf-8'))
# 6.关闭套接字
new_client_socket.close()
tcp_server_socket.close()
if __name__ == '__main__':
main()
tcp客户端代码示例:
import socket
def main():
# 1.创建套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.链接服务器
server_ip = input('tcp服务器IP:')
server_port = int(input('tcp服务器端口:'))
tcp_socket.connect((server_ip, server_port))
# 3.发送/接收消息
recv_data = tcp_socket.recv(1024)
print('服务器发送过来的消息: %s' % (recv_data.decode('gbk')))
send_data = input('请输入需要给客户端发送的消息:')
tcp_socket.send(send_data.encode('gbk'))
# 4.关闭套接字
tcp_socket.close()
if __name__ == '__main__':
main()
三、问题与解决方法
1、UDP
2、TCP
总结
UDP:
- UDP是无连接的,即发送数据之前不需要建立连接,发送完数据也不需要断开连接,减少了开销和发送数据前创建连接的时延。
- UDP是尽最大努力交付,即不保证可靠交付。
- UDP是面向报文的,对应用程序交付下来的报文,在添加首部后就向下交付IP层。UDP一次交付一个完整的报文,应用程序需要选择合适的报文大小。报文过长时,向下交给IP层后,IP层在传送时需要进行分片,降低IP层的效率。报文过短,UDP将它交给IP层后,IP数据报的首部相对长度太大,也会降低IP层效率。
- UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送效率降低。
- UDP支持一对一、一对多、多对一、多对多的交互通信。即单播、多播、广播。
- UDP首部开销小,只有8个字节,比TCP的20个字节的首部要短。
TCP:
- TCP是面向连接的运输层协议,即应用程序在使用TCP协议前需要先建立TCP连接,传送完数据后需要释放已经建立的连接。
- 每一条TCP连接只能有2个端点,即每一条TCP连接只能是点对点。
- TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达。
- TCP提供全双工通信。允许通信双方的应用进程在任何时候都可以发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
- 面向字节流。流入到进程或从进程流出的字节序列。
参考
计算机网络(第六版)