TCP/IP
TCP/IP体系结构
TCP/IP协议族
Application(文本传输、电子邮件、虚拟终端):Telnet、DNS、FTP、HTTP、SMTP、SNMP
Transport(提供端对端的接口):TCP、UDP
Network(为数据包选择路由):IP、ICMP
Data Link(传输有地址的帧以及错误检测功能):ARP、RARP
协议族解读
DNS:Domain Name System域名解析系统
ARP: Address Resolution Protocol 地址解析协议,根据IP地址获得MAC地址。
RARP:反向地址转换协议(RARP:Reverse Address Resolution Protocol) 反向地址转换协议,MAC地址转换为IP地址。
IP地址
IP地址分类
iP:用来唯一标识网络中的一台主机
iPv4:32位的无符号整数
分类:基本类 特殊类
基本类:A B C
特殊类:DE
组成:网络号+主机号
A:1+3 以二进制0开头
0xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
0.0.0.0-127.255.255.255
主机号全0和主机号全1都不可以标识主机
0.0.0.0代表当前主机的任意ip
127.x.x.1—127.255.255.254用于本地环回
主要用于大型网络,其中10.x.x.x用于A类的局域网
B:2+2 以10开头
10xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
128.0.0.0-191.255.255.255
用于局域网的ip:176.10.x.x
C:3+1以110开头
110xxxxx xxxxxxxx xxxxxxxx xxxxxxxx
192.0.0.0-223.255.255.255
局域网:192.168.x.x
D:不区分网络号和主机号 以1110开头
1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx
224.0.0.0.0-239.255.255.255
用于组播
E:不区分网络号和主机号 以11110开头
用于网络测试
子网掩码
子网掩码:有连续的1和连续的0组成
1.子网掩码可以转换为32位二进制无符号整数,特点是连续的1(网络号)和连续的0(主机号).
2.主机的IP地址&子网掩码=该主机的网络地址即:网络位+主机位(与主机号相对应,而不是光看0)
3.广播地址:网络地址的主机位全部变为1;
4.接收广播能得到的最大主机数:2^主机位数-2(全0和全1的不能接收广播)
5.子网掩码不能单独存在,它必须结合IP地址一起使用.
端口号
概念:
端口(Port)包括逻辑端口和物理端口两种类型,。TCP/IP协议中的端口就是逻辑端口,通过不同的逻辑端口来区分不同的服务。一个IP地址的端口通过16bit进行编号,最多可以有65536个端口。端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535。
3.TCP端口号与UDP端口号独立
功能
端口有什么用呢?我们知道,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区 分不同的服务的。
分类:
端口号由IANA管理:
1.众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
2.已登记端口:1024~49151
3.动态或私有端口:49152~65535
例如:
21端口分配给FTP(文件传输协议服务)
25端口分配给SMTP(简单邮件传输协议服务)
80端口分配给HTTP服务
135端口分配给RPC(远程过程调用)
字节序
小端序(little-endian)
字节的低位即最低有效位(LSB,Least Significant Byte)即0X0D存放在存储单元的起始位置
大端序(big-endian)
字节的高位即最高有效位(MSB, Most Significant Byte)即0X0A存放在存储单元的起始位置
网络中传输的数据必须按网络字节序,即大端字节序
在大部分PC机上,当进程将整数送入socket前,需要转换为网络字节序;当应用进程从socket取出整数后,要转换成 字节序
判断主机字节序
由于指针指向内存的起始位置,可以用来判断大小端
#include <stdio.h>
int main(void)
{
int iVar=0x12345678;
int *p = &iVar;
char * pchar = (char *)p;
int a = *pchar;
printf("%x\n",iVar);
printf("%x\n",a);
getchar();
return 0;
}
字节序转换函数
主机字节序到网络字节序(host to net)
uint16_t htons(unit16_t hostshort);//传入值:主机字节序的16bit数据
uint32_t htonl(unit32_t hostlong);//主机字节序的32bit数据
网络字节序到主机字节序(net to host)
uint16_t ntohs(unit16_t netshort);//网络字节序的16bit数据
uint32_t ntohl(unit32_t netlong);//网络字节序的32bit数据