1. TCP和UDP的相同点:
TCP和UDP都是在网络层,都是传输层协议,都能都是保护网络层的传输,双方的通信都需要开放端口。
2.TCP和UDP的不同点:
TCP传输协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。
UDP是Internet协议集支持一个无连接的传输协议,为应用程序提供了一种无需建立连接,就可以发送封装的IP数据包的方法;
两者的区别主要如下,首先,TCP面向连接,而UDP是无连接的,也就是说,UDP发送数据前不需要建立连接; 其次,TCP提供的服务更可靠,换句话说,通过TCP连接传输的数据无差错、不丢失、不重复,并且能够按序到达,而UDP不保证可靠交付; 第三,TCP面向字节流,也就是说TCP处理数据时,看成一连串无结构的字节流,而UDP则面向报文的,TCP连接只能是点到点的,但UDP不但支持一对一,还可以一对多、多对一和多对多的交互通信,UDP的首部开销8个字节比TCP的20字节要小。
3.网络字节序和主机字节序的转换函数实践
1.为什么要进行转换?
在进行网络编程时,由于网络字节的顺序和主机的字节顺序可能存在不同,需要进行转换以统一“格式”
2.什么是网络字节顺序和主机字节顺序呢?
2.1网络字节顺序NBO(Network Byte Order):
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式,统一格式可以避免兼容性问题。
2.2主机字节顺序(HBO,Host Byte Order):
不同的机器的主机字节顺序(HBO)不一定相同,与CPU设计有关。
详解:
不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
最常见的有两种
1. Little-endian:将低序字节存储在起始地址
2. Big-endian :将高序字节存储在起始地址
LE(little-endian)将地址低位存储值的低位,将地址高位存储值的高位,是最符合人的思维的字节序。因为从人的思维来说低位值小,就应该放在内存地址小的地方,也即内存地址低位;反之,高位值大就应该放在内存地址大的地方,也即内存地址高位。
BE(big-endian)的地址低位存储的是值的高位,地址高位存储的是值的低位,它是最直观的字节序。说直观是它不需要考虑对应关系,只需要把内存地址从左到右按照由低到高的顺序写出;把值按照通常的高位到低位的顺序写出,两者对照,一个字节一个字节的填充进去。例如:
在内存中双字0x01020304的存储方式
内存地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
内存地址BE LE
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
通常来说,x86 cpu是Little-Endian。而一般ARM CPU也是Little-Endian。
但是当前常见的开发板使用的处理器比如S3C2410A、S3C2440等都是大小端支持的,可以通过软件选择。
3.如何进行网络字节顺序和主机字节顺序的转换?
网络中传输的数据有的和本地字节存储顺序一致,而有的则截然不同,为了数据的一致性,就要把本地的数据转换成网络上使用的格式,然后发送出去,接收的时候也是一样的,经过转换然后才去使用这些数据,基本的库函数中提供了这样的可以进行字节转换的函数,如和htons( ) htonl( ) ntohs( ) ntohl( ),这里n表示network,h表示host,htons( ) htonl( )用于本地字节向网络字节转换的场合,s表示short,即对2字节操作,l表示long即对4字节操作。同样ntohs( )ntohl( )用于网络字节向本地格式转换的场合
1、htons 把unsigned short类型从主机序转换到网络序
2、htonl 把unsigned long类型从主机序转换到网络序
3、ntohs 把unsigned short类型从网络序转换到主机序
4、ntohl 把unsigned long类型从网络序转换到主机序
在使用little endian的系统中 这些函数会把字节序进行转换,在使用big endian类型的系统中这些函数会定义成空宏。
标签:UDP,顺序,字节,主机,网络,TCP From: https://www.cnblogs.com/1713564464qq/p/16771812.html