TCP/UDP对比
1.TCP面向连接 (如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2.TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3.TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流:UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5.TCP首部开销20字节;UDP的首部开销小,只有8个字节
6.TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
端口号作用
一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务SMTP服务等
这些服务完全可以通过I个IP地址来实现。那么,主机是怎样区分不同的网络服务呢? 显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。
实际上是通过“IP地址+端口号”来区 分不同的服务的。端口提供了一种访问通道,
服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69。
字节序
一、概念
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序,是在跨平台和网络编程中,时常要考虑的问题。
二、分类
字节序经常被分为两类:
1. Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
2.Little-Endian(小端):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
网络字节序 = 大端字节序
三、高低地址与高低字节
高低地址:
C程序映射中内存的空间布局大致如下:
最高内存地址 0xFFFFFFFF
栈区(从高内存地址,往 低内存地址发展。即栈底在高地址,栈顶在低地址)
堆区(从低内存地址 ,往 高内存地址发展)
全局区(常量和全局变量)
代码区
最低内存地址 0x00000000
高低字节
在十进制中靠左边的是高位,靠右边的是低位,在其他进制也是如此。例如 0x12345678,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
网络字节序 就是 大端字节序:4个字节的32 bit值以下面的次序传输,首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit
主机字节序 就是 小端字节序,现代PC大多采用小端字节序。
四、例子
字节序转换api
#include <netinet/in.h>
uint16_t htons(uint16_t host16bitvalue);//返回网络字节序的值 uint32_t htonl(uint32_t host32bitvalue);//返回网络字节序的值 uint16_t ntohs(uint16_t net16bitvalue); //返回主机字节序的值 uint32_t ntoh(uint32_t net32bitvalue); //返回主机字节序的值
h代表host,n代表net,s代表short (两个字节),l代表long (4个字节).通过上面的4个函数可以实现主机字节序和网络字节序之间的转换。有时可以用INADDR ANYINADDR ANY指定地址让操作系统自己获取