TCP/IP

2016-04-11  本文已影响0人  知君远来

TCP/IP

TCP/IP体系结构

tcp_layers_encaps_addr.png

TCP/IP协议族

Application(文本传输、电子邮件、虚拟终端):Telnet、DNS、FTP、HTTP、SMTP、SNMP
Transport(提供端对端的接口):TCP、UDP
Network(为数据包选择路由):IP、ICMP
Data Link(传输有地址的帧以及错误检测功能):ARP、RARP

images.png

协议族解读

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存放在存储单元的起始位置


280px-Little-Endian.svg.png

大端序(big-endian)

字节的高位即最高有效位(MSB, Most Significant Byte)即0X0A存放在存储单元的起始位置


280px-Big-Endian.svg.png

网络中传输的数据必须按网络字节序,即大端字节序
在大部分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数据

上一篇下一篇

猜你喜欢

热点阅读