嵌入式学习-网络-Day01

打印 上一主题 下一主题

主题 816|帖子 816|积分 2448

嵌入式学习-网络-Day01
  1.网络发展史
  1.1 局域网(LAN)
  1.2 广域网(Wan)
  1.3 家庭用网
  1.3.1光猫
  1.3.2交换机与路由器:
  2.IP地点
  2.1基本概念
  2.2二级分别(ipv4)
  2.3特殊地点
  2.4子网掩码
  2.5三级分别
  域名系统
  域名结构
  3.网络模子
  3.1 网络的体系结构
  3.2OSI模子
  3.3TCP/IP模子
  3.4常见网络协议
  4.TCP和UDP
  TCP:传输控制协议
  UDP :用户数据报协议
  5. 编程预备知识
  5.1 socket套接字
  5.1.1socket简介
  5.1.2 socket类型
  5.2端标语
  5.3字节序
  5.3.1主机字节序到网络字节序
  5.3.2网络字节序到主机字节序
  5.4IP地点转换
  TCP编程
  函数接口
  1.socket
  2.bind
  3.listen
  4.accept
  5.recv
  6.send
  7.connect
  
  
    1.网络发展史

         ARPAnet    ,即“阿帕网”                           
不能互联不同类型的盘算机和不同类型的操纵系统,没有纠错功能

                              
TCP协议分成了两个不同的协议:

         
用来检测网络传输中差错的传输控制协议TCP

         
专门负责对不同网络举行互联的互联网协议IP

                                     1.1 局域网(LAN)

  局域网的缩写是LAN,local area network,本地的网络,只能实现小范围短隔断的网络通讯。我们的家庭网络是典型的局域网。电脑、手机、电视、智能音箱、智能插座都连在路由器上,可以互相通讯。局域网,就像是小区里的道路,分支多,连接了很多栋楼。
  

  
  1.2 广域网(Wan)

  广域网(Wide Area Network)是相对局域网来讲的,局域网的传输隔断比较近,只能是一个小范围的。假如需要长隔断的传输,好比某大型企业,总部在北京,分公司在长沙,局域网是无法架设的。广域网,就像是大马路,分支可能少,但类型多,像国道、省道、高速、小道等,连接了很多大的局域网。
  

  这时需要其它的办理方案。
  
  第一,通过因特网,只需要办一根宽带,就实现了通讯,非常方便,现在的宽带价格也比较便宜。
  第二,通过广域网专线。
  以是为了数据安全,不能连接因特网,需要用一条本身的专用线路来传输数据,这条线路上只有本身人,不会有其他人接入,且隔断很远,这个网络就叫 “广域网”。
  
  1.3 家庭用网

  1.3.1光猫

  光猫是一种类似于数字调制解调器的装备,接入的是光纤专线,是光信号。用于广域网中光电信号的转换和接口协议的转换,接入路由器,是广域网接入。一端连接运营商的入户线缆,一样平常是光纤,一端连接你本身的路由器。是一个运营商到你本身装备的桥梁。
  

  
  
将光线插入左侧的灰色口,右侧网口接网线到路由器即可。

  1.3.2交换机与路由器:

  交换机:用于局域网内网的数据转发 (转发给多个装备)
  路由器:用于连接局域网和外网 (连接局域网的装备)
  现在大部门路由器内部都是有交换机, 以是路由器都有交换机的功能。
  注意交换机没有IP分配和IP寻址的功能,以是交换机不具备路由器功能。
  
  

  
  

  
  2.IP地点

  2.1基本概念

  

  • IP地点是Internet中主机的标识
  • Internet中的主秘密与别的呆板通讯必须具有一个IP地点
  • IP地点为32位(IPv4)或者128位(IPv6)
  • 每个数据包都必须携带目的IP地点和源IP地点,路由器依靠此信息为数据包选择路由
  • 表现情势:常用点分十进制情势,如202.38.64.10,最后都会转换为一个32位的无符号整数。
  2.2二级分别(ipv4)

  ip = 网络号 + 主机号
  网络号:表现是否在一个网段内(局域网)
  主机号:标识在本网内的ID,同一局域网内不能重复
  

  
  A:1.0.0.0~126.255.255.255
  B: 128.0.0.0 ~ 191.255.255.255
  C:192.0.0.0 ~ 223.255.255.255
  D: 224.0.0.0~239.255.255.255
  E: 240.0.0.0~247.255.255.255
  2.3特殊地点

  特殊地点不能分配给主机利用
  网络地点:用于标识网络的起始地点, 有用网络号+全是0的主机号
  192.168.50.132 -》192.168.50.0
  128.1.2.3 -》128.1.0.0
  12.1.2.3 -》12.0.0.0
  广播地点:用于给局域网内全部主机发送数据利用, 有用网络号+全是1的主机号
  192.168.50.132 ->192.168.50.255
  128.1.2.3 ->128.1.255.255
  12.1.2.3 ->12.255.255.255
  拓展:
  0.0.0.0: 用于服务器中, 0.0.0.0指的是监听本机上全部的IPV4地点
  接受来自任意源IP地点的数据包,常用于服务器程序监听全部网络接口的连接请求。
  127.0.0.1:回环地点/本机地点,一样平常用来测试利用,全部发往该类地点的数据包都应该被loop back
  原样送回;
  练习:C类地点,同一网段最多可以连接多少个主机?? 192.168.1.0
  256-2=>254
  2.4子网掩码

  作用:可以将一个IP分别成网络地点和主机地点
     特点:
   

  • 子网掩码长度是和IP地点长度完全一样的,32bit的二进制数组成;
  • 网络号全为1,主机号全为0
    C类默认子网掩码:255.255.255.0
  B :255.255.0.0
  A :255.0.0.0
  练习1: 子网掩码255.255.255.0,该网段可以容纳多少台主机?
  192.168.0.125 & 255.255.255.0 -》192.168.0.0
  子网掩码 & ip地点 = 网络地点
  ~子网掩码 &ip地点 = 主机地点
  2.5三级分别

  作用:重新区分网络号和主机号,重新组网。将二级地点变为三级地点。(提高利用率)
  举例: 800个电脑 ,在不浪费IP的情况下,如何分别网段?
  子网掩码:255.255.252.0
  二级地点ip = 网络号 + 主机号
  三级地点ip = 网络号 + 子网号 + 主机号
  练习1
  已知一个子网掩码号为255.255.255.192,问,最多可以连接多少台主机?
  2^6 = 64 -2 = 62
  练习2
  某公司有四个部门:行政、研发1、研发2、营销,每个部门各30台盘算机接入公司局域网交换机,假如要在192.168.1.0网段为每个部门分别子网,子网掩码应该怎么设置,每个子网的地点范围分别是什么?(4个部门之间不能通讯)
  255.255.255.1100 0000
  子网掩码:255.255.255.192
  192.168.1.00:
  192.168.1.1 ~ 192.168.1.62
  
  192.168.1.01:
  192.168.1.65 ~ 192.168.1.126
  
  192.168.1.10:
  192.168.1.129 ~ 192.168.1.190
  
  192.168.1.11:
  192.168.1.193 ~ 192.168.1.254
  练习3
  有两台电脑主机,在最少浪费IP地点的情况下,将172.16.14.4与172.16.13.2划归为同一网段,则子网掩码应该设置为?
  255.255.252.0
  0000 1110 0000 0100
  0000 1101 0000 0010
  域名系统

  由于利用IP地点来指定盘算机不方便人们记忆,且输入时候轻易出错,用字符标识网络中盘算机名称方法。
  这种命名方法就像每个人的名字,这就是域名(Domian Name)
  域名服务器(Domain Name server):用来处理IP地点和域名之间的转换。
  域名系统(Domain Name System,DNS):域名翻译成IP地点的软件
  一个域名,可以绑定多个ip
  域名结构

  例如域名 www.baidu.com.cn 从右向左看
  cn为高级域名,也叫一级域名,它通常分配给主干节点,取值为国家名,cn代表中国
  com为网络名,属于二级域名,它通常表现组织或部门
  中国互联网二级域名共40个,edu表现教育部门,com表现商业部门,gov表现当局,军队mil等等
  baidu为机构名,在此为三级域名,表现百度
  www:万维网world wide web,也叫环球信息网,是一种特殊的信息结构框架。
  3.网络模子

  3.1 网络的体系结构

  

  • 网络采用分而治之的方法设计,将网络的功能分别为不同的模块,以分层的情势有机组合在一起。
  • 每层实现不同的功能,其内部实现方法对外部其他条理来说是透明的。每层向上层提供服务,同时利用下层提供的服务
  • 网络体系结构即指网络的条理结构和每层所利用协议的集合
  • 两类非常重要的体系结构:OSI与TCP/IP
  3.2OSI模子

  

  • OSI模子是一个理想化的模子,尚未有完整的实现
  • OSI模子共有七层
  • OSI现阶段只用作教学和理论研究
  

  
  
应用层:指定特定应用的协议,文件传输,文件管理,电子邮件等

  表现层:确保一个系统应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据分析,管理数据加密,解密;
  会话层:通讯管理,负责创建或者断开通讯连接
  传输层:端标语,数据传输到具体那个进程程序(端到端)
  网络层:路由器中是有算法的,ip,(主机到主机)(路由的转发)
  链路层:格式变为帧(把数据分成包,一帧一帧的数据举行发送)
  物理层:传输的是bit流(0与1一样的数据),物理信号,没有格式
  3.3TCP/IP模子

  

  
OSI和TCP/IP模子对应关系图

  

  3.4常见网络协议

     网络接口和物理层:
   PPP:拨号协议(老式电话线上网方式)
   ARP:地点分析协议 IP-->MAC
   RARP:反向地点转换协议 MAC-->IP
   网络层:
   IP(IPV4/IPV6):网间互连的协议
   ICMP:网络控制管理协议,ping 下令利用
   IGMP:网络分组管理协议,广播和组播利用
   传输层:
   TCP:传输控制协议
   UDP:用户数据报协议
   应用层:
   SSH:加密协议
   telnet:远程登录协议
   FTP:文件传输协议(TCP)
   TFTP:简单文件传输协议(UDP)
   HTTP:超文本传输协议(明文发送)HTTPS加密传输
   DNS:域名分析协议
   SMTP/POP3:邮件传输协议
    4.TCP和UDP

  TCP:传输控制协议

  TCP(Transmission Control Protocol)是一种面向连接的传输层协议,它能提供高可靠性通讯(即数据无误、数据无丢失、数据无失序、数据无重复到达的通讯)
  1. 适用情况:
  2. 1、适合于对传输质量要求较高,以及传输大量数据的通信。
  3. 2、在需要可靠数据传输的场合,通常使用TCP协议
  4. 3、MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
  5. 缺点:
  6. 发送量较大,效率低
复制代码
UDP :用户数据报协议

  UDP (User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。在数据发送前,因为不需要举行连接,以是可以举行高服从的数据传输
  1. 适用情况:
  2. 1.发送小尺寸数据(如对DNS服务器进行IP地址查询时)
  3. 2.在接收到数据,给出应答较困难的网络中使用UDP。
  4. 3.适合于广播/组播式通信中。
  5. 4.MSN/QQ/skype 等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
  6. 5.流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输
复制代码
    Dos(拒绝式服务)攻击?
   DOS:即 Denial of service,拒绝服务的缩写,拒绝服务,Dos 攻击即攻击者想办法让目标呆板停止提供服务或资源访问,这些资源包括磁盘空间、内存、进程以致网络带宽,从而制止正常用户的访问。
   要对服务器实施拒绝服务攻击,主要有以下两种方法:
   ①迫使服务器的缓冲区满,不吸收新的请求;
   
②利用IP欺骗,迫使服务器把正当用户的连接复位,影响正当用户的连接,这也是Dos攻击实施的基本头脑。为便于明白,以下介绍一个简单的Dos攻击基本过程:攻击者先向受害者发送大量带有虚假地点的请求,受害者发送复兴信息后期待回传信息。由于是伪造地点,以是受害者不停等不到回传信息,分配给这次请求的资源就始终不被释放。当受害者期待一定时间后,连接会因超时被切断,此时攻击者会再度传送一批伪地点的新请求,这样反复举行直至受害者资源被耗尽,终极导致受害者系统瘫痪。

    5. 编程预备知识

  5.1 socket套接字

  5.1.1socket简介

  1》1982 - Berkeley software Distributions操纵系统引入了socket作为本地进程之间通讯的接口
  2》1986 - Berkeley扩展了socket接口,使之支持UNIX下的TCP/IP 通讯
  3》现在很多应用(FTP,Telnet)都依赖这一接口
     socket
   1、是一个编程接口
   2、是一种特殊的文件描述符(everything in unix is a file)
   3、并不但限于TCP/IP协议
   4、面向连接(Transmission control Protocol - TCP/IP)
   5、无连接(User Datagram Protocol -UDP和Inter-network Packet Exchange- IPX
    5.1.2 socket类型

  流式套接字(SOCK_STREAM)   TCP
  提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送次序吸收。内设置流量控制,避免数据流沉没慢的吸收方。数据被看作是字节省,无长度限定。
  数据报套接字(SOCK_DGRAM)  UDP
  提供无连接服务。数据包以独立数据包的情势被发送,不提供无差错保证,数据可能丢失或重复,次序发送,可能乱序吸收。
  原始套接字(SOCK_RAW)
  可以对较低条理协议如IP、ICMP直接访问。
  

  5.2端标语

  

  • 为了区分一台主机吸收到的数据包应该转交给哪个进程来举行处理,利用端标语来区分
  • TCP端标语与UDP端标语独立
  • 端口用两个字节来表现 2byte
  1. 众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
  2. 已登记端口:1024~49151    (选1000以上10000以下)
  3. 动态或私有端口:49152~65535
复制代码
5.3字节序

  

  • 字节序是指不同类型的cpu主机,内存存储 "多字节整数" 序列的方式
  • 浮点类型,字符类型,字符串没有字节序。
  • 小端序(little-endian) - 低序字节存储在低地点 (主机字节序)
  • 大端序(big-endian) - 高序字节存储在低地点 (网络字节序)
  口试题:写一个函数,判定当前主机的字节序?
  1. #include<stdio.h>
  2. union value
  3. {
  4.     int a;
  5.     char b;
  6. };
  7. int main(int argc, char const *argv[])
  8. {
  9.     //1.指针指向
  10.     int a = 0x12345678;
  11.     char *p = &a;
  12.     printf("%#x\n",*p);
  13.     //2.共用体
  14.     union value val;
  15.     val.a = 0x12345678;
  16.     printf("%#x\n",val.b);
  17.     //3.类型强转
  18.     char b = (char)a;
  19.     printf("%#x\n",b);
  20.     return 0;
  21. }
复制代码
5.3.1主机字节序到网络字节序

  1. u_long htonl(u_long hostlong);
  2. u_short htons(u_short short);//掌握这个
复制代码
5.3.2网络字节序到主机字节序

  1. u_long ntohl(u_long hostlong);
  2. u_short ntohs(u_short short);
复制代码
5.4IP地点转换

  1. typedef uint32_t in_addr_t;
  2. struct in_addr
  3. {
  4.     in_addr_t s_addr;
  5. };
  6. in_addr_t inet_addr(const char *ip);//从人看的IP地址转换为机器使用的32位无符号整数
  7. char *inet_ntoa(struct in_addr in);//从机器到人
复制代码
代码测试:
  1. #include <sys/socket.h>
  2. #include <netinet/in.h>
  3. #include <arpa/inet.h>
  4. #include<stdio.h>
  5. int main(int argc, char const *argv[])
  6. {
  7.     //1.将字符串ip转换成32位无符号整数
  8.     in_addr_t addr  = inet_addr("192.168.50.123");
  9.     printf("%#x\n",addr);
  10.     //2.将32位无符号整数转换为字符串ip
  11.     struct in_addr in;
  12.     in.s_addr = addr;
  13.     char *p = inet_ntoa(in);
  14.     printf("%s\n",p);
  15.     return 0;
  16. }
复制代码
TCP编程

  
  

  1. 服务器:
  2.    1.创建流式套接字(socket())------------------------>  有手机
  3.    2.指定本地的网络信息(struct sockaddr_in)----------> 办电话卡
  4.    3.绑定套接字(bind())---------------------------->将电话卡插入手机
  5.    4.监听套接字(listen())---------------------------->待机
  6.    5.链接客户端的请求(accept())---------------------->接电话
  7.    6.接收/发送数据(recv()/send())-------------------->通话
  8.    7.关闭套接字(close())----------------------------->挂机
  9. 客户端:
  10.    1.创建流式套接字(socket())----------------------->有手机
  11.    2.指定服务器的网络信息(struct sockaddr_in)------->有对方号码
  12.    3.请求链接服务器(connect())---------------------->打电话
  13.    4.发送/接收数据(send()/recv())------------------->通话
  14.    5.关闭套接字(close())--------------------------- >挂机
复制代码
函数接口

  1.socket

  1. #include <sys/types.h>          /* See NOTES */
  2. #include <sys/socket.h>
  3. int socket (int domain,int type, int protocol) ;
  4. 功能:创建套接字
  5. 参数:
  6.     domain:协议族
  7.         AF_UNIX,AF_LOCAL      本地通信
  8.         AF_INET                ipv4
  9.         AF_INET6               ipv6
  10.     type:套接字类型
  11.         SOCK_STREAM:流式套接字
  12.         SOCK_DGRAM:数据报套接字
  13.         SOCK_RAW:原始套接字
  14.     protocol:协议–填0自动匹配底层,根据type系统默认自动帮助匹配对应协议
  15.     返回值:
  16.         成功      文件描述符
  17.         失败      -1,更新errno
复制代码
2.bind

  1. #include <sys/types.h>          /* See NOTES */
  2. #include <sys/socket.h>
  3. int bind (int sockfd,const struct sockaddr * addr ,socklen t addrlen) ;
  4. 功能:绑定
  5. 参数:
  6.     socket:套接字
  7.     addr:用于通信结构体(提供的是通用结构体,需要根据选择的通信方式,填充对应
  8. 结构体--通信方式由当时socket第一个参数确定)
  9.     addrlen:结构体大小
  10.     返回值:成功0    失败-1,更新errno
  11. 通用结构体:
  12. struct sockaddr {
  13.     sa_family_t sa_family;
  14.     char    sa _data [14];
  15. }
  16. ipv4通信结构体:
  17. struct sockaddr_in {
  18.     sa_family_t    sin_family;//协议族
  19.     in_port_t    sin_port;    //端口号
  20.     struct in_addr sin_addr;    //ip地址
  21. };
  22. struct in_addr {
  23.     uint32_t    s_addr;
  24. };
  25. 本地通信结构体:
  26. struct sockaddr_in{
  27.     sa_family_t sun_family;    /* AF_UNIX *///协议族
  28.     char    sun_path [108];    /*pathname *///路径
  29. };
复制代码
3.listen

  1. #include <sys/types.h>          /* See NOTES */
  2. #include <sys/socket.h>
  3. int listen(int sockfd, int backlog);
  4. 功能:监听,将主动套接字变为被动套接字
  5. 参数:
  6. sockfd:套接字
  7. backlog:同时响应客户端请求链接的最大个数,不能写0.
  8.   不同平台可同时链接的数不同,一般写5,10个
  9.   返回值:成功 0   失败-1,更新errno  
复制代码
4.accept

  1. #include <sys/types.h>          /* See NOTES */
  2. #include <sys/socket.h>
  3. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  4. accept(sockfd,NULL,NULL);
  5. 阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,则accept()函数返回,返回一个用于通信的套接字文件;
  6. 参数:
  7.    Sockfd :套接字
  8.    addr: 链接客户端的ip和端口号
  9.       如果不需要关心具体是哪一个客户端,那么可以填NULL;
  10.    addrlen:结构体的大小
  11.      如果不需要关心具体是哪一个客户端,那么可以填NULL;
  12.   返回值:
  13.      成功:文件描述符; //用于通信
  14. 失败:-1,更新errno
复制代码
5.recv

  1. ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  2. 功能: 接收数据
  3. 参数:
  4.     sockfd: acceptfd ;//用于通信的文件描述符
  5.     buf  存放位置
  6.     len  大小
  7.     flags  一般填0,相当于read()函数
  8.     MSG_DONTWAIT  非阻塞
  9. 返回值:
  10.    < 0  失败出错  更新errno
  11.    ==0  表示客户端退出
  12.    >0   成功接收的字节个数
复制代码
6.send

  1. ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  2. 功能:发送数据
  3. 参数:
  4.     sockfd:用于通信的文件描述符
  5.     buf:发送内容存放的地址
  6.     len:发送内存的长度
  7.     flags:如果填0,相当于write();
复制代码
7.connect

  1. int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
  2. 功能:用于连接服务器;
  3. 参数:
  4.      sockfd:socket函数的返回值
  5.      addr:填充的结构体是服务器端的;
  6.      addrlen:结构体的大小
  7. 返回值
  8.       -1 失败,更新errno
  9.       正确 0
复制代码
服务器端:
  1. #include <sys/types.h> /* See NOTES */
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <netinet/ip.h>
  5. #include <arpa/inet.h>
  6. #include <unistd.h>
  7. #include <stdio.h>
  8. #define N 128
  9. int main(int argc, char const *argv[])
  10. {
  11.     // 1.创建套接字
  12.     int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  13.     if (sockfd < 0)
  14.     {
  15.         perror("socket err:");
  16.         return -1;
  17.     }
  18.     // 2.填充结构体(ipv4)
  19.     struct sockaddr_in addr;
  20.     addr.sin_family = AF_INET;                          // 协议族ipv4
  21.     addr.sin_port = htons(8888);                        // 端口号(网络字节序)
  22.     addr.sin_addr.s_addr = inet_addr("192.168.50.202"); // ip地址(网络字节序)
  23.     // 3.绑定
  24.     int ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
  25.     if (ret < 0)
  26.     {
  27.         perror("bind err:");
  28.         return -1;
  29.     }
  30.     // 4.监听
  31.     if (listen(sockfd, 5) < 0)
  32.     {
  33.         perror("listen err");
  34.         return -1;
  35.     }
  36.     // 5.等待连接
  37.     int acceptfd = accept(sockfd, NULL, NULL);
  38.     if (acceptfd < 0)
  39.     {
  40.         perror("accpet err:");
  41.         return -1;
  42.     }
  43.     // 6.接收
  44.     char buf[N] = {};
  45.     ret = recv(acceptfd, buf, N, 0);
  46.     if (ret == -1)
  47.     {
  48.         perror("recv err:");
  49.         return -1;
  50.     }
  51.     printf("recv:%s\n", buf);
  52.     // 7.关闭
  53.     close(acceptfd);
  54.     close(sockfd);
  55.     return 0;
  56. }
复制代码
注意事项:
  1)收发的字节大小注意一致,否则可能越界
  2)服务器端收发用的是accepfd ,不要写成用于通讯的sockfd
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表