1. tcp/ip实际上是一个协同工作的通信家族,为网络数据通信提供了通路,主要分为三部分:①传输控制协议(TCP)和用户数据报协议(UDP);②Internet协议(IP);③处于TCP和UDP之上的一组应用协议;
2. TCP:全称传输控制协议,对建立网络上用户进程间的对话负责,他确保进程之间的可靠通信,并建立连接,提供的功能如下:①监听输入对话建立请求;②请求另一网络站点对话;③可靠的发送和接收数据;④适度的关闭对话; 具有严格的内装差错检验算法确保数据的完整性,tcp是面向字节的顺序协议,意味着包内的每个字节被分配一个顺序编号,并分配给每包一个顺序号;具有特定的TCP协议头;
3. UDP:全称用户数据报文协议,提供不可靠的非连接型传输层服务,它允许在源和目的地之间传送数据,而不必在传送数据之前建立对话(偶发性不定时性连接);当接收数据时它不向发送方提供确认信息,它不提供输入包的顺序,如果出现丢失包或重份包的情况,也不会向发送方发出差错报文,不占用进程,执行速度比TCP快,但是可靠性差;具有特定的UDP协议头;
4. IP:主要有四个功能:①数据传送;②寻址;③路由选择;④数据报文的分段;IP的主要目的是为数据输入/输出网络提供基本算法,为高层协议提供无连接的传送服务。就是说IP只封装和传递数据,但不向发送者或接受者报告包的状态,不处理所遇到的故障,只负责路由、寻址功能,相当于快递的运输司机,同时也是联网的入口; IP由协议头与协议数据两部分构成;具有特定的IP协议头;
5. Linux中的网络编程通过socket(套接口)实现,socket是一种文件描述符;套接口socket有三种类型:
(1)流式套接字(SOCK_STREAM),可以提供可靠的、面向连接的通讯流,对应的是TCP协议,保证了数据传输的正确性和顺序性;
(2)数据报套接字(SOCK_DGRAM),定义了一种无连接的服务,并且不保证可靠,无差错,对应的是UDP协议;
(3)原始套接字,主要用于新的网络协议的测试等;
6. 两种地址接口
(1)通用地址接口
struct sockaddr
{
u_short sa_family; //地址族,一般采用AF_INET这个宏代表ipv4;
char sa_data[14]; //14字节特定协议地址;
};
(2)第二种地址接口
struct sockaddr_in
{
short int sin_family; //地址族,一般采用AF_INET这个宏代表ipv4;
unsigned short int sin_port; //端口号;区别不同的进程,比如消息发给qq还是微信;服务器的IP与端口绑定,让多个客户端找到,而客户端不绑定;
struct in_addr sin_addr; //,具体的IP地址,也是一个结构体,具体结构如下面;
unsigned char sin_zero[8]; //8字节填0;
};
//具体的IP地址
struct in_addr
{
unsigned long s_addr; //这里是一种长整型数据,而IP地址是一种①点分十进制或者②点分字符串,需要对其进行转换才可以给该结构体成员赋值;
};
7. 地址转换函数,IP地址通常由数字加点(192.168.0.1)的形式,而在struct in_addr中使用的是IP地址是由32位的整数表示的,所以需要转换数据类型,有以下两个函数可以转换:
(1)int inet_aton(const char * cp, struct in_addr * inp); //ascii码转
(2)char *inet_ntoa(struct in_addr in);
函数里面 a 代表 ascii n 代表network.第一个函数表示将a.b.c.d形式的IP转换为32位的IP,存在在 inp指针里面。第二个是将32位IP转换为a.b.c.d的格式。
8. 字节序转换——大小端转换,统一按照大端进行网络传输,如果自己的电脑是小端,则将自己的电脑发送和接收信息后都要转换;
字节序转换函数(头文件:#include<arpa/inet.h>) | |
htons | 把unsigned shorrt 类型从主机序转换到网络序 |
htonl | 把unsigned long类型从主机转换到网络序 |
ntohs | 把unsigned short 类型从网络序转换到主机序 |
ntohl | 把unsigned long类型从网络序转换到主机序 |