Linux嵌入式网络 _ 网络基础

一、网络发展历史和分层

1、Internet 的历史

  • Initernet — 冷战的产物

       

        

2、网络互联促成了TCP/IP协议的产生

       

       

3、网络互联促成了TCP/IP协议的产生

      

      

       

4、网络的体系结构

      

     

      

     

                                                              OSI开放系统互连模型

          

  • 二层交换机  一般对应OSI七层模型中 的数据链路层;  较便宜       偏硬件
  • 三层交换机  一般对应OSI七层模型中 的网络层;      有贵有便宜   偏软件

                                                TCP/IP协议时Internet事实上的工业标准

一共有四层:                   

  • OSI模型 与 TCP/IP模型的之间的联系: 

                         

二、TCP/UDP特点

1、TCP/IP模型中  各层之间的 主要协议 

                                                   

 —  各层中 比较常用的协议:

                            

2、TCP协议的特点

        

       

3、UDP协议的特点

      

      

            

4、应用层常用通信协议

                               

5、TCP/IP协议通信模型

                                   

                            

6、网络传输 的封包与拆包  -------  两主机网络传输实例

                    

三、网络编程的预备知识

1、socket

     —  socket 是网络编程的一种资源;

     —  是一个应用编程接口;是一种特殊的文件描述符(可以使用 read()  write()  close() 等操做);

     —  面象连接(Transmission  Control  Protocol  —  TCP/IP)

     —  并不仅限于TCP/IP;

     —  无连接(User  Datagram Protocol  —  UDP 和 Inter—network  Packet Exchange — IPX)

  • Socket 的类型
  1. 流式套接字(SOCK_STREAM) :提供了一个面象连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流量淹没慢的接收方。数据被看作字节流,无长度限制。
  2. 数据套接字(SOCK_DGRAM): 提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收;
  3. 原始套接字(SOCK_RAM) :可以对较低层次协议如IP 、ICMP直接访问。
  • Socket 处于应用空间 于内核 之间

                                     

                         

2、IP地址

  • IP地址是Internet 中主机的标识

       —  Internet 中的主机要与别的机器通信 必须具有一个IP地址;

       —  IP地址 为32位(IPV4)和 128位(IPV6)

       —  每个数据包都必须携带目的的IP地址和源IP地址,路由器依靠此信息为数据包选择路由;

  • 表示形式: 常用点分形式,如202.38.64.10 最后都会转换为一个32 位的 无符号整数;
  • IP地址分类

       —  mobileIPV6:local IP (本地注册的IP)   roam  IP (漫游IP)

       —  IPV4 :采用32位的整数来表示; IPV6:采用128位的整数来表示;

  • 子网掩码
  • 特殊IP地址

       —  局域网IP :192.xxx.xxx.xxx     10.xxx.xxx.xxx

       —  广播IP :    xxx.xxx.xxx .255     255.255.255.255 (全网广播)

       —  组网IP :    224.xxx.xxx.xxx~239.xxx.xxx.xxx

  • IP地址的转换

       —  inet _ aton( )   :将strptr 所指的字符串转换成32位的网络字节序二进制值;

           #include  <arpa/inet.h>

            int   inet _ aton( const char *strptr , struct in_addr  *addrptr ) ;

          inet _ addr( )   :功能同上,返回转换后的地址;

           #include  <arpa/inet.h>

            int_addr_t  inet _ addr( const char *strptr  ) ;

            strptr: 点分形式的IP地址,结果是32位整数(内部包含了 字节的转换,默认是网络字节的模式)

            特点: (1) 仅适用于IPV4  ;(2) 当出错时,返回-1; (3) 此函数不能用于255.255.255.255的转换; 

          inet _ ntoa( )   :将32位的网络字节序二进制值 地址转换成点分十进制的字符串;

           #include  <arpa/inet.h>

            char *  inet _ ntoa( struct in_addr  inaddr ) ;

       —   inet _ pton( )   :将IPV4/IPV6 的地址转换成binary格式;

           #include  <arpa/inet.h>

             int inet _ pton( int af ,const char * arc , void *dst ) ;

            参数: af:地址协议镞(AF_INET或AF_INET6)

                         arc: 是一个指针(填写点分形式的IP地址(主要指 IPV4))

                         dst: 转换的结果给到dst;

            特点: (1) 适用于IPV4/IPV6  ;(2) 能用于255.255.255.255的转换; (3)  成功返回1 ,失败返回0或则其他;

       —   inet _ ntop( )   :

           #include  <arpa/inet.h>

           const char *inet_ntop( int af ,const char * arc , void *dst , socklen_t size ) ;

            参数: af:地址协议镞(AF_INET或AF_INET6)

                         arc: 是一个指针(填写点分形式的IP地址(主要指 IPV4))

                         dst: 转换的结果给到dst;

            特点: (1) 适用于IPV4/IPV6  ;(2) 能用于-1的转换; (3)  成功返回不为NULL ,失败返回NULL;

  •         IPV6IP地址:       

3、端口号

  • 为了区分一台主机 接收到的数据包应该交给哪个进程来进行处理,使用端口号来区别;(进程也可以称之为任务)
  • TCP端口号与UDP端口号独立;
  • 端口号一般由IANA(Internet  Assigned  Numbers  Authority)管理

       —  众所周知端口:1~1023(TFP:21   SSH:22   HTTP : 80   HTTPS :  469) (1~255之间为众所周知号,256~1023端口通常由UNIX系统占用)

       —  注册端口: 1024~49150;

       —  动态或私有端口 :59151~65535

注: 保留端口:1024~5000(不建议使用)      可以使用的端口:5000~65535

  • 网络里面的通信是由   IP地址 + 端口号  来决定的;

4、字节序

  • 不同类型的CPU的主机中,内存储存多字节 整数序列 有两种方法,称为主机字节序(HBO)

        —  小端序列(little_endian): — 低序字节存储在低地址;

              (1) 将低字节存储在起始地址,称为“little_endian”字节序,Intel 、AMD等。

        —  大端序列(big_endian): — 高序字节存储在低地址;

              (1) 将高字节存储在起始地址,称为“big_endian”字节序,由ARM、Motorola等所采用。

  • 网络中传输的数据必须按网络字节序,即大端字节序;
  • 在大部分PC机上,当应用进程需要将整数送入socket前,需要转换成网络字节序;当应用进程从socket取出整数后,要转换成小端字节序;

                                 

                                      

  • PC机  、ARM 采用小端字节序; powerpc/mips 、arm用作路由器时  采用大端字节序;
  • 字节序转换函数

         — 把给定系统所采用的字节序称为主机字节序。为了避免不同类型主机之间在数据交换时由于对于字节序的不同而导致的差错;引入了网络字节序;

         — 主机字节序到网络字节序

              (1) u_long  htonl(u_long  hostlong)

              (2) u_short  htons(u_short  short)

         — 网络字节序到主机字节序

              (1) u_long   ntohl(u_long  hostlong)

              (2) u_short  ntohs(u_short  short)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值