Linux嵌入式式开发 学习 网络编程:day1

VNC   192.168.1.31
【1】     IP分类(主机cmd—>ipconfig)
        192.168.1.31  C类 ,  点分十进制IP
        C0A8011F   4*8 = 32位
        
        104.243.29.189
        
         IP分类:网络号+主机号
        A类: 0
            第1字节为网络地址,其他3个字节为主机地址。第1字节的最高位固定为0;
            0.0.0.0   -  127.255.255.255            00000000 - 01111111
        B类: 10
            128.0.0.0 -  191.255.255.255         10000000 - 10111111
        C类: 110
            192.0.0.0 -  223.255.255.255          11000000 - 11011111
        
        D类:  1110 
            224.0.0.0  -  239.255.255.255        11100000 - 11101111
        
        E类: 1111
            保留
    ============================================
        42亿   70 80   
        IPv4: 点分十进制IP   
        IPv6:巨特么多,世界上每一粒沙子分配一个ip
        
        192.168.1.0 - 192.168.1.255   => 256
        (最多可以连接主机的个数为 254( 除去首尾,除网络地址0,广播地址255))
    网络概念:
        局域网可以理解为是一个小型网络;
        若干个小型网络组合在一起可以组合成大型网络 => 以太网
        Inetnet
    =============================================
        
        想把192.168.1.0该网段内IP分成4组,如何划分?   
        1)
        子网掩码: (前面全是1,后面全是0)
        作用:和IP地址相与,求出网络号和主机号
        255.255.255.0
         1111 1111 1111 1111 1111 1111 0000 0000
                          网络号                              主机号
        2)            
        引入子网号的概念
        
        4组:  00 01 10 11   => 2^2
        修改子网掩码
        1111 1111 1111 1111 1111 1111 1100 0000
        255.255.255.192
        3)
        子网范围:
              
            1:      192.168.1.1-   192.168.1.62
             2:      192.168.1.65-               126
             3:      192.168.1.129-             190
             4:      192.168.1.193-             254
        4个子网的IP是从1 - 254 (0 -255),并且这4类间不能直接通信的;
        只要有不能通信要想到网络号不能通信.
    问题:
    已知一个子网掩码号为255.255.255.192,问,最多可以连接多少台主机?
        62台
        256 - 192 = 64  - 2 = 62台
        2^6 = 64 - 2 = 62台;
        
    子网掩码:是一个32位的整数,作用是将某一个IP划分成网络地址和主机地址;
              目的是合理的利用IP资源;
        
        A类:
            子网掩码: 255.0.0.0
        B类:
            子网掩码: 255.255.0.0
        C类:
            子网掩码: 255.255.255.0
        
    ===========================================================
【2】OSI模型
    OSI模型是最理想的模型
   
低层: 
    通信子网:
    物理层:传输的是bit流,物理信号、接口、信号形式、速率,没有格式
    链路层:格式变为帧(数据组成可发送、接收的帧)
    网络层:路由器中是有算法的,ip,(主机到主机)(数据分组、路由选择)
    面向通信:
    传输层:端口号,数据传输到具体那个进程程序    (端到端)
    
高层:
    面向服务:
    会话层:通信管理,负责建立或者断开通信连接
    表示层:确保一个系统应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据加密,解密;
    面向应用:
    应用层:指定特定应用的协议,文件传输,文件管理,电子邮件等。   
        
【3】TCP/IP协议 (世界主流网络语言)
    应用层        TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
    传输层        TCP,UDP
    网络层        IP,ICMP,RIP,OSPF,BGP,IGMP
    网络接口与物理层    SLIP,CSLIP,PPP,ARP,RARP,MTU ISO2110,IEEE802.1,EEE802.2
    
【4】(重点,面试会问)
    UDP TCP 协议相同点
    都存在于传输层
     TCP : 面向连接,可靠
     TCP(即传输控制协议):
        是一种 面向连接的传输层协议,它能提供 高可靠性通信(即数据无误、数据无丢失、
        数据无失序、数据无重复到达的通信)
        适用情况:                                                                                                                       
        适合于对传输质量要求较高,以及传输大量数据的通信。
        在需要可靠数据传输的场合,通常使用TCP协议
        MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
    
    
     UDP :  无连接,不可靠
     UDP(User Datagram Protocol)用户数据报协议,是 不可靠无连接的协议。在数据发送前,
        因为不需要进行连接,所以可以进行 高效率的数据传输。
    适用情况:
        发送小尺寸数据(如对DNS服务器进行IP地址查询时)
        在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)
        适合于广播/组播式通信中。
        MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
        流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输
        
【5】Socket
    sockfd  = 3?
    
是一个编程接口;
返回一种特殊的文件描述符 (everything in Unix is a file), 用于通信的
并不仅限于TCP/IP协议
面向连接 (Transmission Control Protocol - TCP/IP)
无连接 (User Datagram Protocol -UDP 和 Inter- network Packet Exchange - IPX)
【6】socket类型
流式套接字(SOCK_STREAM)   TCP
    提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
数据报套接字(SOCK_DGRAM)  UDP
    提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
(你不当黑客用不着)原始套接字(SOCK_RAW) ping
    可以对较低层次协议如IP、ICMP直接访问。    
        
【7】端口号(vi /etc/services)
    为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别
    TCP端口号与UDP端口号独立 (可以重复)
    端口号一般由IANA (Internet Assigned Numbers Authority) 管理
        众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
        已登记端口:1024~49151
        动态或私有端口:49152~65535
    一般使用:6666 8888 7777 9999 10000 10001
    
        端口号范围:1——65535
        我们用的:5000——65535
    sin_port
    
    不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO):
     小端序(little-endian) - 低序字节存储在低地址
    将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;
     大端序(big-endian)- 高序字节存储在低地址
    将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola等所采用
    
    网络中传输的数据必须按网络字节序,即大端字节序
    
    在大部分PC机上,当应用进程将整数送入socket前,需要转化成网络字节序;当应用进程从socket取出整数后,要转化成小端字节序)
    
    如何检测字节序
        方法一:使用指针
        方法二:file命令,其中LSB的L代表小端存储    
    
    主机字节序转化网络字节序?
    小端 转 大端     
        
【8】 TCP编程流程
服务器端:
    1) socket(), 创建套接字文件, 用于连接  sockfd(有一个属性默认是阻塞)
    2) bind(), 绑定,把socket()函数返回的文件描述符和IP、端口号进行绑定;
    3) listen(), (监听)将socket()返回的文件描述符的属性, 由主动变为被动;    
    4) accept(), 阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,
                则accept()函数返回, 返回一个用于通信的套接字文件;
    5) recv(), 接收客户端发来的数据;   read()
    6) send(), 发送数据;
    7) close(), 关闭文件描述符;关闭两个(连接、通信);
    
客户端:
    1) socket(),创建套接字文件,既用于连接,也用于通信;
            完成一个结构体的填充( 填对应服务器的IP和端口号
    2) connect(); 用于发起连接请求;
    3) send(), 发送数据;
    4) recv(), 接收数据;
    5) close(), 关闭文件描述符;
【9】socket
    NAME
       socket - create an endpoint for communication
    SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>
        int socket(int domain, int type, int protocol);
       功能: 创建套接字文件
       参数:
             domain:协议族
                 AF_UNIX, AF_LOCAL   用于本地通信
                 AF_INET                      IPv4 Internet protocols          ip(7)
                 AF_INET6                    IPv6 Internet protocols          ipv6(7)
             type:协议类型
                SOCK_STREAM       TCP
                SOCK_DGRAM       UDP            
            protocol:
                一般情况下写0
                系统默认自动帮助匹配对应协议
                传输层:IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP
                网络层:htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)    
        返回值:
            成功: 返回一个文件描述符;
            失败: -1
【10】bind
     int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    功能: 绑定,将socket()返回值和IP/端口号进行绑定;
    参数:
         sockfd:  是socket()函数的返回值;
         const struct sockaddr *addr:
                    struct sockaddr是结构体类型,是一个通用结构体;
                    struct sockaddr {
                            sa_family_t sa_family;    // 2个字节typedef unsigned short int sa_family_t;  //
                            char        sa_data[14];  // 14字节
                    }
                整个结构体大小为16个字节
            
                 在填充的时候填充struct sockaddr_in ;
                struct sockaddr_in {
                    unsigned short sin_family;  //协议IPv4,2个字节
                    unsigned short sin_port;    //端口号 ,2个字节                                                                
                    struct in_addr    sin_addr;   
                    struct in_addr {
                         __be32  s_addr; //IP地址,4个字节                                                                                             };
                    /* Pad to size of `struct sockaddr'. */
                    unsigned char     __pad[__SOCK_SIZE__ - sizeof(short int) -
                        sizeof(unsigned short int) - sizeof(struct in_addr)];
                            //8个字节
                };
         addrlen:
            结构体的大小;
                sizeof(serveraddr);
        返回值:
            -1  失败
【11】listen
    int listen(int sockfd, int backlog);
    功能: 用于监听,将主动套接字变为被动套接字;
    参数:
         sockfd:  socket()的返回值
         backlog:客户端同时连接服务器的最大个数;(队列1:保存正在连接)
                                                                            (队列2,连接上的客户端)
            5 6 7 8
    返回值:
        失败 -1
【12】 accept
     int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
     accept(sockfd,NULL,NULL);
        阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,
                则accept()函数返回,返回一个用于通信的套接字文件;
    参数:
         sockfd
         addr:   如果不需要关系具体是哪一个客户端,那么可以填NULL;
         addrlen:如果不需要关系具体是哪一个客户端,那么可以填NULL;
    返回值:
         文件描述符;
         acceptfd;
        
【13】 recv   
     ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    功能: 接收数据
    参数:
        sockfd: acceptfd ;
        buf  存放位置
        len  大小
        flags  一般填0,相当于read()函数
        
            MSG_DONTWAIT
    返回值:
        < 0  失败出错
        ==0  表示客户端退出
        >0   成功接收的字节个数
    
        
作业:  
    1. 实现服务器代码,使用telnet工具测试
        telent IP 端口号
    2.     尝试实现客户端代码;
        
        
inet_addr()
有主机字节序转化为网络字节序(大端),返回转换后的地址。
in_addr_t inet_addr(const char *strptr);
inet_ntoa()
将32位网络字节序二进制地址转换成点分十进制的字符串。
char * inet_ntoa(stuct in_addr inaddr);
主机字节序到网络字节序
u_long htonl (u_long hostlong);
u_short htons (u_short short);
网络字节序到主机字节序
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);  //short 2字节
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值