目录
1、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则是不可靠信道
2、什么是端口号
所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号。
3、端口号的作用
在一台计算机上同时可以进行多个应用程序,例如接受www服务的Web浏览器、电邮客户端、远程登录用的ssh客户端等程序都可以同时进行。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并精准的将数据传输。
4、什么是字节序
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序
大端字节序:高字节存放在低地址,低字节存放在高地址
小端字节序:低字节存放在低地址,高字节存放在高地址
网络字节序 = 大端字节序
(1)主机字节序转网络字节序
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); 无符号的32位整型数据的转换
int16_t htons(uint16_t hostshort); 无符号的16位整型数据的转换
功能:htons和htonl都是实现将主机字节序数据转换为网络字节序数据
参数:hostlong和hostshort标识主机字节序数据
返回值:网络字节序数据
(2)网络字节序转主机字节序
#include <arpa/inet.h>
uint32_t ntohl(uint32_t netlong); 无符号的32位整型数据的转换
uint16_t ntohs(uint16_t netshort); 无符号的16位整型数据的转换
参数:netlong和netshort标识网络字节序数据
返回值:主机字节序数据
(3)将字符串IP地址转换为网络字节序的整型数据
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
参数1:af表示地址协议族
AF_INET: 基于IPV4协议族的IP地址
AF_INET6: 基于IPV6协议族的IP地址
参数2:src指针指向的字符串IP地址;
参数3:det目标指针用来返回转换接收的整型数据(网络字节序的IP地址);
返回值:
装换成功返回1;af指定地址协议族中没有找到IP则返回0,否则失败返回-1
(4)将网络字节序数据转换为主机字符串IP地址
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
参数1:af表示地址协议族
AF_INET: 基于IPV4协议族的IP地址
AF_INET6: 基于IPV6协议族的IP地址
参数2:传递网络字节序IP地址的整型数据存储空间的地址;
参数3:返回主机字节序IP地址,
参数4:表示参数3所对对应空间的大小
size可以使用宏定义:
INET_ADDRSTRLEN //ipv4空间大小;
INET6_ADDRSTRLEN //ipv6空间大小;
返回值:成功返回dst的指针,失败返回NULL且修改errno的值。
(5)网络字节序IP和主机字节序IP转换其它API
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
功能: 将cp指向的主机字节序IP地址转换为网络字节序的IP地址存储在结构体指针inp指向的空间中
in_addr_t inet_addr(const char *cp);
功能:将cp指向的主机字节序IP地址转换为网络字节序的IP地址通过函数的返回值返回
i