zoukankan      html  css  js  c++  java
  • Python TCP与UDP的区别

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

    TCP通信需要经过创建连接、数据传送、终止连接三个步骤。

    TCP 特点
    面向连接
    通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。

    双方间的数据传输都可以通过这一个连接进行。

    完成数据交换后,双方必须断开此连接,以释放系统资源。

    这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。

    可靠传输
    TCP采用发送应答机制
    TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

    超时重传
    发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
    TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

    错误校验
    由发送端计算,然后由接收端验证,其目的是为了检测数据在发送端到接收端之间是否有改动,如果接收方检测到校验和有差错,则直接丢弃这个数据包。

    流量控制和阻塞管理
    流量控制用来避免主机发送得过快而使接收方来不及完全收下。

    TCP 网络程序流程

    TCP 优缺点

    优点:可靠,稳定适合传输大量数据

    缺点:传输速度慢 、占用系统资源高

    TCP 使用场景

    当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。

    UDP 网络程序流程

    UDP 网络程序发送数据不需要建立连接

    TCP与UDP的小例子(Python)

    TCP客户端 client

    import socket

    from pip._vendor.distlib.compat import raw_input

    target_host = "127.0.0.1"
    target_port = 9999
    #建立一个socket 对象
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 链接客户端
    client.connect((target_host,target_port))
    # print("connect%s %d" %(target_host,target_port))
    while True:
    data = raw_input('>')
    client.send(data)
    data = client.recv(1024)
    if not data:
    break
    print(data)

    TCP服务端server

    import socket
    bind_ip="0.0.0.0"
    bind_port = "9999"
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind((bind_ip,bind_port))
    server.listen(5)
    try:
        while True:
            client,add = server.accept()
            print("[*]你监听的是:%s:%d" %(add[0],add[1]))
            while True:
                data = client.recv(1024)
                if not data:
                    break
                    print(data)
                data = raw_input('>')
                client.send(data)
                print(data)
            else:
                client.close()
    except Exception as e:
        print(e)
    server.close()

    UDP 客户端 client

    import socket
    PORT =5555
    HOST = '127.0.0.1'
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    data = "hello UDP".encode()
    s.sendto(data,(HOST,PORT))
    print(s.recv(1024))
    print('Send:%s to %s:%s ' %(data,HOST,PORT))
    s.close()

    UDP 服务端 server

    import socket
    PORT =5555
    
    HOST = '127.0.0.1'
    s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.bind((HOST,PORT))
    while True:
        data,addr = s.recvfrom(1024)
        print("Receive %s" %(data.decode(),addr))
        # s.sendto("Hello".encode()+data,addr)
  • 相关阅读:
    设计模式之解释器
    mina学习
    我的学习网站(个人)
    jq实现剪裁图片设置为头像
    元素跟随着滚动条运动
    解决鼠标滚动的时候多次执行函数
    利用随机数生成一个简单的验证码
    自定义单选框或者复选框
    jquery实现旋转木马的插件slick
    js判断页面是pc打开还是手机打开
  • 原文地址:https://www.cnblogs.com/toby-yu/p/12357734.html
Copyright © 2011-2022 走看看