嵌入式学习第二十三天--网络及TCP

打印 上一主题 下一主题

主题 968|帖子 968|积分 2904

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

历程通讯的方式:



同一主机
传统 
system V
不同主机 
网络 --- 解决不同主机间 的历程间通讯 

网络 (通讯)
  //1.物理层面 --- 联通(通路)
     //卫星 
     2G
     3G
     4G
     5G 
     星链 (千帆)


  //2.逻辑层面 --- 通路(软件)
      MAC os
      LINUX 
      windows 

协议
    一套规则 
    网络协议 --- 网络通讯的一套规则 
    通讯协议 --- EDID 

ARPA (阿帕网)
   早期的ARPA网络使用(Network Control Protocol)NCP协议,不支持不同类型的操作系统、不同类型的计算机之间的通讯,不支持纠错功能。
      不同类型 计算机 
      不同 操作系统 
      无法纠错
 

TCP协议(Transmission Control Protocol)


控制传输过程 
tcp/ip 

ip地址: 作用  ---唯一标识网络上的一台主机
                 主机 ---网络中一台设备 
   
   ip地址 ---本质上是一个32位的数值 
             存储 -- 大端方式存储 
   ip地址构成 
   ip = 网络号 + 主机号 
        网络号 用来标识 --- 是在哪一个网络 
        主机号 用来标识 --- 在该网络中的哪一台计算机 
www.baidu.com (网址)
    |  
    | ---DNS剖析 (Domain Name Server)
    |
    | ---DNS剖析---ip地址  183.2.172.17
    | ---[路由器]
       

 子网掩码  ---- 用来区分 和 识别 网络号 和 主机号 
  
  毗连特定的 DNS 后缀 . . . . . . . :
   IPv4 地址 . . . . . . . . . . . . : 192.168.0.41
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 192.168.0.1
   192    .   168     .     0     .   1      
1111 1111 . 1111 1111 . 1111 1111 . 0000 0000  &
--------------------------------------------------
   192         168          0           0        //网络号 

协议:
   OSI标准  (open system )
       open system interconnect

1、OSI 模型


 ===》开放系统互联模型  ==》分为7层:
 理想模型  ==》尚未实现
        应用层   
        表示层  加密解密  gzip   
        会话层  网络断开,毗连状态,keep-close keep-alive 
        传输层tcp  udp  协议  文件    视频,音频  ipx 
                "12345"
        网路层ip   NAT
               网间层 网际层 
        链路层  交换机  数据的格式化  帧 校验
        物理层         100Mb/8  10Gbits   100MB 同轴电缆
         发送 比特流  //
               
      tcp/ip协议栈
        应用层   ====》应用程序
        传输层   ====》端标语tcp udp
        网络层   ====》IP 地址
        物理层   ====》网卡 驱动  1GB


网络编程 



编程 
 
linux操作系统 
[用户空间]          应用层                      //程序员实现
------------------------------------------------------
[内核空间]          传输层   [网络协议栈]       //内核已经实现好的 属于网络功能
                    网络层
                    数据链路层
                    物理层 
                    
                    
程序发送数据 
  
系统调用 --- 通过系统调用来使用操作系统提供的网络功能 
函数接口 --- socket 
socket:
  1. 操作系统提供的函数接口  //通过这个接口可以使用网络功能
  2. 套接字
     在使用的思绪上,套接字 被抽象成了文件 
     特殊文件 --- 专门用来进行网络通讯 
     文件 描述符
     read
     write 
      

    
网络编程模型:



  1.c/s 模型 
  
   client ----- server
   QQ   
   
  2.b/s 模型 
    Brower / server  //欣赏器 - 服务器 
  
  3.p2p 模型 
    peer 2 peer   //点 对 点 
   迅雷下载 
   云盘下载
   


c/s 模型 
  基于 两种传输协议实现 
  tcp 协议
  传输层的协议 --- 控制传输过程 
   tcp 
        特点:
        1.面向链接  
        2.可靠传输 
        3.字节省 
        
  应用:
      登录网站 ---tcp 
      qq登录 
  udp 协议 
    偏重  传输服从 
     udp 
       特点:
        1.无毗连 
        2.不可靠
        3.数据报 
  应用:
      视频传输 
      
   
   
tcp的毗连:
    三次握手 
    client --------------  server
           1--毗连哀求-->
           2<--回应------
           3---确认----->
    client //作为自动的角色 
    server //被动角色 
可靠传输:
       无差错
       无丢失 --- 每个字节 都编号 
       无失序 --- 
       无重复 --- 

tcp的编程:
流程
  1.创建毗连 
  2.数据通讯 
  
  //通讯模型 cs   --- 打电话 
  
  //客户端 
  1.socket         //买了个手机 
  2.bind (可选)    // sim 卡 
  3.connect        // 拨打电话
  
  
  //服务器端 
  1.socket         //买了个手机 
  2.bind           // sim 卡 
  3.listen         // 监听 --待机
  4.accept         // 接听 
  
  #include <sys/types.h>          /* See NOTES */
  #include <sys/socket.h>
int socket(int domain, int type, int protocol);


功能:程序向内核提出创建一个基于内存的套接字描述符
参数:domain  地址族,PF_INET == AF_INET ==>互联网程序
                      PF_UNIX == AF_UNIX ==>单机程序
      type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP   
              SOCK_DGRAM   用户数据报套接字===>UDP
              SOCK_RAW     原始套接字  ===》IP
      protocol 协议 ==》0 表示自动适应应用层协议。
返回值:成功 返回申请的套接字id
        失败  -1;
  
  

connect 


2.int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
   功能:该函数固定有客户端使用,表示从当前主机向目的
            主机发起链接哀求。
   参数:sockfd 本地socket创建的套接子id
            addr 远程目的主机的地址信息。
         addrlen: 参数2的长度。
   返回值:成功 0
              失败 -1;

网络通讯过程 
                    QQ_A                        QQ_B
[用户空间]           |                            |
-------------------socket-----------------------socket--------------
[内核空间]      [传输层tcp]                   [传输层tcp]                              
                     | 
                  [网络层]                     [网络层]
                     |
                [数据链路层]                 [数据链路层]
                     | 
                 [物理层]  ----------------->  [物理层]
                 
网络中找到主机 ---- ip
找到主机中历程 ---- 端标语 
  端标语 
   作用: 用来标识一个历程 
  构成:
       16位的数据 
  
  0~65535 
  // 
  1~1023 // 着名端标语 
         80   http
         23  
         21 
  1024~50000 //系统注册的 
  >=50000     //动态的 
  
ip+端标语 ==> 网络中历程的唯一地址 
struct sockaddr  //地址的类型 
struct sockaddr_in {
           sa_family_t    sin_family; /* address family: AF_INET */
           in_port_t      sin_port;   /* port in network byte order */
           struct in_addr sin_addr;   /* internet address */
       };
       /* Internet address. */
       struct in_addr {
           uint32_t       s_addr;     /* address in network byte order */
       };
network byte order //网络字节序 ---大端 

   //字节序转换 
 #include <arpa/inet.h>
       uint32_t htonl(uint32_t hostlong);  //主机到网络 
       uint16_t htons(uint16_t hostshort);
       uint32_t ntohl(uint32_t netlong);  //网络到主机 
       uint16_t ntohs(uint16_t netshort);
//ip地址转换        
 in_addr_t inet_addr(const char *cp);
 "192.168.0.1"
 
bind 


2、int bind(int sockfd, struct sockaddr *my_addr, 
             socklen_t addrlen);
功能:假如该函数在服务器端调用,则表示将参数1相干
      的文件描述符文件与参数2 指定的接口地址关联,
      用于从该接口担当数据。
      假如该函数在客户端调用,则表示要将数据从
      参数1所在的描述符中取出并从参数2所在的接口
      设备上发送出去。
      注意:假如是客户端,则该函数可以省略,由默认
            接口发送数据。
返回值:
    成功 0 
    失败 -1
    
listen


3、  int listen(int sockfd, int backlog);
    功能:在参数1所在的套接字id上监听等待链接。
    参数:sockfd  套接字id
          backlog 答应链接的个数。
    返回值:成功  0
            失败  -1;

    accept



4、int accept(int sockfd, struct sockaddr *addr, 
                socklen_t *addrlen);
   功能:从已经监听到的队列中取出有效的客户端链接并
            接入到当前程序。
   参数:sockfd 套接字id
            addr  假如该值为NULL ,表示不论客户端是谁都接入。
                假如要获取客户端信息,则事先界说变量
               并传入变量地址,函数实行完毕将会将客户端
               信息存储到该变量中。
         addrlen: 参数2的长度,假如参数2为NULL,则该值
                     也为NULL;
                 假如参数不是NULL,&len;
                  肯定要写成len = sizeof(struct sockaddr);
   返回值:成功 返回一个用于通讯的新套接字id;
                从该代码之后所有通讯都基于该id
           失败  -1;    
   
  
    

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表