• TCP和UDP的区别与联系以及网络字节序和主机字节序的转换函数实践


    TCP和UDP的区别

    TCP是一个面向连接的、可靠的、基于字节流的传输层协议。

    UDP是一个面向无连接的传输层协议。

    具体来分析,和 UDP 相比,TCP 有三大核心特性:

    面向连接:所谓的连接,指的是客户端和服务器的连接,在双方互相通信之前,TCP 需要三次握手建立连接,而 UDP 没有相应建立连接的过程。

    可靠性TCP 花了很多的功夫来保证连接的可靠,这个可靠性体现在哪些方面呢?一个是有状态,另一个是可控制。

    TCP 会精准记录哪些数据发送了,哪些数据被对方接收了,哪些没有被接收到,而且保证数据包按序到达,不允许半点差错。这是有状态

    当意识到丢包了或者网络环境不佳,TCP 会根据具体情况调整自己的行为,控制自己的发送速度或者重发。这是可控制

    相应的,UDP 就是无状态不可控的。

    面向字节流UDP 的数据传输是基于数据报的,这是因为仅仅只是继承了 IP 层的特性,而 TCP 为了维护状态,将一个个 IP 包变成了字节流。

    举个例子就是说,我们的视频通话就是使用UDP协议来尽最大能力让你听完,不管有的没的;而下载文件就是TCP,一定要保障文件的完整性。

     

    TCP和UDP的联系

    首先TCP和UDP都是运输层的协议,然后他们都是建立在IP之上,TCP是交流式套接字,而UDP是报文套接字。

    网络字节序和主机字节序的转换函数实践

    代码如下:

    SOCKADDR_IN addrSrv;

    addrSrv.sin_addr.S_un.S_addr=htonl(2130706689);

    先是定义了一个IP地址结构体addrSrv,然后初始化它的IP时addrSrv.sin_addr.S_un.S_addr必须是赋值IP地址的网络字节序,htonl函数的作用是把一个主机字节序转换为网络字节序,也就是上面转换过程中第二步转换为第三步的作用,127.0.1.1的主机字节序是21307066689,把主机字节序2130706433转换为网络字节序就是htonl(2130706689)=16842879,所以如果你知道网络字节序是16842879的话,addrSrv.sin_addr.S_un.S_addr=htonl(2130706689);与addrSrv.sin_addr.S_un.S_addr=16777689;是完全一样的。

    addrSrv.sin_addr.S_un.S_addr=htonl(2130706689);这句还可以写为:

    addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.1.1"); 结果是完全一样的。

    可见inet_addr函数的转换作用就是上面的第一步到第三步的转换。

    然后就是端口的主机字节序和网络字节序也是同理,端口号就是主机字节序,先把端口转成16位的二进制数,然后把前八个和和八个调换位置在转成十进制就是网络字节序。

  • 相关阅读:
    python中class使用总结
    PTE深度了解(一)
    【马士兵】Python基础--06
    目标检测YOLO实战应用案例100讲-基于YOLOv5的目标检测与6D位姿估计算法研究(下)
    LeetCode 面试题 16.01. 交换数字
    docker下使用seata异常
    50年前,Hello World发明者第一次提交的Go代码长这样……
    HTML核心(9)- 列表元素
    TCP是什么、UDP是什么,它们有什么区别
    财报解读:将低价作为“唯一性基础武器”的京东,效果在慢慢显现
  • 原文地址:https://www.cnblogs.com/dzxdwybk/p/16773530.html