从UDP到TCP,你经历了多少鞭挞


​ 我本来想先写一下TCP/IP协议,但奈何形容词汇实在匮乏,所以我决定还是就从UDP开始写到TCP吧,若是对网络协议陌生可自行Google(host文件添加Google以及IP即可访问,或者用vpn)。

​ 首先说下UDP:

UDP介绍

UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

UDP特点:

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

【适用情况】

UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,比如

  • 语音广播

  • 视频

  • QQ

  • TFTP(简单文件传送)

  • SNMP(简单网络管理协议)

  • RIP(路由信息协议,如报告股票市场,航空信息)

  • DNS(域名解释)

注重速度流畅

UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。

下面是使用UDP的收发数据的代码:

发送方:

from socket import *


def main():
    # 创建UDP套接字
    udpServer = socket(AF_INET, SOCK_DGRAM)

    # 接收方IP和PORT
    sendAddr = ('10.7.152.139', 8080)

    # 获取要发送的数据
    sendData = input('Input:').encode('utf-8')

    # 发送数据到指定IP
    udpServer.sendto(sendData, sendAddr)

    # 关闭套接字
    udpServer.close()


if __name__ == '__main__':
    main()

接收方:

from socket import *


def main():
    # 创建udp套接字
    udpclient = socket(AF_INET, SOCK_DGRAM)

    # 绑定接收PORT
    udpclient.bind(('', 8080))

    # 接收对方发送信息
    recvData, addr = udpclient.recvfrom(1024)

    # 显示接收到的信息
    print(recvData.decode('utf-8'))

    # 关闭套接字
    udpclient.close()


if __name__ == '__main__':
    main()

TCP优点

TCP---传输控制协议。UDP能够通信并且数据传输较快,但是它并不能保证数据的可靠通信,若是通信双方答非所问想必亦是极为无奈的。所以TCP有三个UDP都不曾具备的特点:

1、数据不丢:TCP传输数据有三次握手机制可以保证传输数据的完整性

2、数据不传错:TCP的冗余校验机制可以保证数据的准确性

3、缓解网络拥堵:除开以上两方面外,TCP还有一个滑动窗口机制可以控制传输所占带宽,有效缓解网络拥堵

所以TCP基于这三个机制之上的数据传输完全可靠。但是任何存在都不会只有优点没有缺点,TCP亦是如此。

TCP缺点

TCP的三次握手机制可以保证数据传输的完整性,但是正应为有三次确定的流程所以数据传输的速度比不上UDP。

TCP的冗余校验机制可以保证数据传输的准确性,但也是正应为如此所以数据传输的体积要大于实际数据体积。

TCP的滑动窗口机制可以保证对拥堵的网络带宽有效缓解,但是在网络状况不好的情况下,数据传输速度也会相应缓慢。

所以选择通信协议的时候可以根据需求来使用UDP和TCP。像传输视频可以用UDP,毕竟视频卡个一帧两帧没人会太过计较。但是账号密码就需要TCP,如果账号密码不对是因为通信的原因,想必用户体验也是极差。

TCP收发数据代码:

发送方:


from socket import socket, AF_INET, SOCK_STREAM


def main():
    server = socket(AF_INET, SOCK_STREAM)  # socket默认是使用TCP传输协议,所以()里面可以不写
    server.bind(('10.7.152.139', 8080))  # 绑定IP和PORT
    server.listen(512)  # 开启监听

    while True:
        client, addr = server.accept()  # 接收请求
        print(str(addr) + '已连接')
        data = input('Input:')
        client.send(data.encode('utf-8')) # 编码发送


if __name__ == '__main__':
    main()

接收方:

from socket import socket, AF_INET, SOCK_STREAM


def main():
    client = socket(AF_INET, SOCK_STREAM)
    client.connect(('10.7.152.139', 8080))  # 接收IP和端口
    data = client.recv(1024)  # 接收信息
    print(data.decode('utf-8'))  # 解码显示


if __name__ == '__main__':
    main()

总结一下就是:TCP传输可以保证数据的可靠传输,但是这些都建立在诸多验证机制上。
UDP不能保证数据的可靠传输,但是对不要求数据完整性的数据传输速度快一点点。
所以建议使用TCP

​ 我本来想先写一下TCP/IP协议,但奈何形容词汇实在匮乏,所以我决定还是就从UDP开始写到TCP吧,若是对网络协议陌生可自行Google(host文件添加Google以及IP即可访问,或者用vpn)。

​ 首先说下UDP:

UDP介绍

UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

UDP特点:

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

【适用情况】

UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,比如

  • 语音广播

  • 视频

  • QQ

  • TFTP(简单文件传送)

  • SNMP(简单网络管理协议)

  • RIP(路由信息协议,如报告股票市场,航空信息)

  • DNS(域名解释)

注重速度流畅

UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。

下面是使用UDP的收发数据的代码:

发送方:

from socket import *


def main():
    # 创建UDP套接字
    udpServer = socket(AF_INET, SOCK_DGRAM)

    # 接收方IP和PORT
    sendAddr = ('10.7.152.139', 8080)

    # 获取要发送的数据
    sendData = input('Input:').encode('utf-8')

    # 发送数据到指定IP
    udpServer.sendto(sendData, sendAddr)

    # 关闭套接字
    udpServer.close()


if __name__ == '__main__':
    main()

接收方:

from socket import *


def main():
    # 创建udp套接字
    udpclient = socket(AF_INET, SOCK_DGRAM)

    # 绑定接收PORT
    udpclient.bind(('', 8080))

    # 接收对方发送信息
    recvData, addr = udpclient.recvfrom(1024)

    # 显示接收到的信息
    print(recvData.decode('utf-8'))

    # 关闭套接字
    udpclient.close()


if __name__ == '__main__':
    main()

TCP优点

TCP---传输控制协议。UDP能够通信并且数据传输较快,但是它并不能保证数据的可靠通信,若是通信双方答非所问想必亦是极为无奈的。所以TCP有三个UDP都不曾具备的特点:

1、数据不丢:TCP传输数据有三次握手机制可以保证传输数据的完整性

2、数据不传错:TCP的冗余校验机制可以保证数据的准确性

3、缓解网络拥堵:除开以上两方面外,TCP还有一个滑动窗口机制可以控制传输所占带宽,有效缓解网络拥堵

所以TCP基于这三个机制之上的数据传输完全可靠。但是任何存在都不会只有优点没有缺点,TCP亦是如此。

TCP缺点

TCP的三次握手机制可以保证数据传输的完整性,但是正应为有三次确定的流程所以数据传输的速度比不上UDP。

TCP的冗余校验机制可以保证数据传输的准确性,但也是正应为如此所以数据传输的体积要大于实际数据体积。

TCP的滑动窗口机制可以保证对拥堵的网络带宽有效缓解,但是在网络状况不好的情况下,数据传输速度也会相应缓慢。

所以选择通信协议的时候可以根据需求来使用UDP和TCP。像传输视频可以用UDP,毕竟视频卡个一帧两帧没人会太过计较。但是账号密码就需要TCP,如果账号密码不对是因为通信的原因,想必用户体验也是极差。

TCP收发数据代码:

发送方:


from socket import socket, AF_INET, SOCK_STREAM


def main():
    server = socket(AF_INET, SOCK_STREAM)  # socket默认是使用TCP传输协议,所以()里面可以不写
    server.bind(('10.7.152.139', 8080))  # 绑定IP和PORT
    server.listen(512)  # 开启监听

    while True:
        client, addr = server.accept()  # 接收请求
        print(str(addr) + '已连接')
        data = input('Input:')
        client.send(data.encode('utf-8')) # 编码发送


if __name__ == '__main__':
    main()

接收方:

from socket import socket, AF_INET, SOCK_STREAM


def main():
    client = socket(AF_INET, SOCK_STREAM)
    client.connect(('10.7.152.139', 8080))  # 接收IP和端口
    data = client.recv(1024)  # 接收信息
    print(data.decode('utf-8'))  # 解码显示


if __name__ == '__main__':
    main()

总结一下就是:TCP传输可以保证数据的可靠传输,但是这些都建立在诸多验证机制上。
UDP不能保证数据的可靠传输,但是对不要求数据完整性的数据传输速度快一点点。
所以建议使用TCP

猜你喜欢

转载自blog.csdn.net/Suvvictor/article/details/80052009