TCP/UDP学习(一)

本文介绍了TCP/UDP协议的基础知识,并通过Python代码示例展示了如何创建和使用UDP及TCP套接字。内容包括UDP的无连接特性、TCP的可靠传输以及两者在实际应用中的优缺点。
摘要由CSDN通过智能技术生成

TCP/UDP学习(一)


前言

巩固学习的知识。

一、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连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
  • 面向字节流。流入到进程或从进程流出的字节序列。

参考

计算机网络(第六版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值