wjjnzn

02、TCP与UDP的联系与区别

TCP与UDP的联系

  • TCP/IP协议集包括应用层,传输层,网络层,网络访问层。
  • TCP/IP协议里,有两个具有代表性的传输层协议,分别就是 TCP 和 UDP。

TCP与UDP的区别

  TCP UDP
可靠性 可靠 不可靠
连接性 面向连接 无连接
首部开销 20字节 8字节
报文 面向字节流 面向报文
效率 传输效率低 传输效率高
双工性 全双工 一对一、一对多、多对一、多对多
流量控制 滑动窗口
拥塞控制 慢开始、拥塞避免、快重传、快恢复

传输速度

应用场景

对效率要求低,对准确性要求高或者要求有连接的场景 对效率要求高,对准确性要求低

TCP

  • TCP是面向连接的、可靠的流协议。它可以保证两端通信主机之间的通信可达。TCP能够正确处理在传输过程中的丢包、传输顺序乱掉等异常情况。此外,TCP还能够有效利用带宽,缓解网络拥堵。
  • TCP为了建立与断开连接,正常过程至少需要来回发送7个包才能完成
  • TCP用于在传输层有必要实现可靠传输的情况。由于它是面向有连接并具备顺序控制、重发控制等机制的,所以它可以为应用提供可靠传输。
  • TCP只能是一对一通信。

UDP

  • UDP面向无连接,是不具有可靠性的数据报协议。在UDP的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。
  • UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信。
  • UDP支持一对一,一对多,多对一和多对多交互通信。

03、网络字节序与主机字节序的转换函数实践。

  • 主机字节序,即CPU存储数据时采用的字节顺序。不同的CPU设计时采用的字节序是不同的,谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86与x86_64(该指令集由AMD率先设计推出)系列CPU。PowerPC系列采用big endian方式存储数据,而x86与x86_64系列则采用little endian方式存储数据。平常大多数PC与服务器如果使用的是Intel与AMD CPU,一般都是little endian。

  • 网络字节序,是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

网络字节序与主机字节序的相互转换

  • 常用系统调用

  Linux socket网络编程中,经常会使用下面四个C标准库函数进行字节序间的转换。

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);        //把uint32_t类型从主机序转换到网络序
uint16_t htons(uint16_t hostshort);        //把uint16_t类型从主机序转换到网络序
uint32_t ntohl(uint32_t netlong);        //把uint32_t类型从网络序转换到主机序
uint16_t ntohs(uint16_t netshort);        //把uint16_t类型从网络序转换到主机序
  • 64位数值的转换

//主机序转网络序
unsigned long long htonll(unsigned long long val)
{
    if(__BYTE_ORDER == __LITTLE_ENDIAN)  
    {
         return (((unsigned long long )htonl((int)((val << 32) >> 32))) << 32) | (unsigned int)htonl((int)(val >> 32));  
    }  
    else if (__BYTE_ORDER == __BIG_ENDIAN)  
    {  
         return val;  
    }  
}  

//网络序转主机序
unsigned long long ntohll(unsigned long long val)  
{  
    if (__BYTE_ORDER == __LITTLE_ENDIAN)
    {
        return (((unsigned long long )ntohl((int)((val << 32) >> 32))) << 32) | (unsigned int)ntohl((int)(val >> 32));  
    }  
    else if (__BYTE_ORDER == __BIG_ENDIAN)  
    {  
        return val;  
    }
 }
  • 实践

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);//<主机字节序转换位网络字节序32,转换IP地址时用>
uint16_t htons(uint16_t hostshort);//<主机字节序16位转换为网络字节序16位,转换端口时用>

uint32_t ntohl(uint32_t netlong);//<网络字节序32位转换为主机字节序32,读的时候会涉及>
uint16_t ntohs(uint6_t netshort)//<网络字节序16位转换位16位主机字节序,同上>

//IP地址转换函数;
#include <arpa/inet.h>
int inet_pton(int af,const charsrc,chardst);//192.168.1.24----->网络字节序
const char* inet_ntop(int af,const voidsrc,char dst,socklen_tsize);//网络字节序—》点分十进制字符串IP;
//参数af:如果时IPv4,选AF_INET,IPV6选择AF_INET6;

转载:https://blog.csdn.net/K346K346/article/details/79053136

相关文章: