美文网首页
网络分层模型及作用

网络分层模型及作用

作者: 吃肉666 | 来源:发表于2017-05-18 12:18 被阅读94次

    1) 物理层
    定义了网络的物理结构、传输的电磁标准、Bit流的编码及网络的时间原则。
    2)数据链路层
    在两个主机上建立数据链路连接,向物理层传输数据信号,并对信号进行处理使之无差错
    并合理地传输。
    3) 网络层
    主要负责路由、选择合适的路径和进行阻塞控制等功能。
    4) 传输层
    向用户提供可靠的端到端服务,它屏蔽了下层的数据通信细节,让用户及应用程序不需要
    考虑实际的通信方法。
    5) 会话层
    主要负责两个会话进程之间的通信,即两个会话层实体之间的信息交换和管理数的交换。
    6) 表示层
    处理通信信号的表示方法,进行不同格式之间的翻译,并负责数据的加密解密,数据的
    压缩与恢复。
    7) 应用层
    保持应用程序之间建立连接所需要的数据记录,为用户服务。

    一、数据封装:
    以太网帧:以太网头部、IP头部、TCP头部、HTTP头部、以太网尾部
    IP数据报:IP头部、TCP头部、HTTP头部、数据
    TCP段:TCP头部、HTTP头部、数据
    HTTP头部、数据
    数据

    IP头部——数据总共46-1500字节

    以太网:以太网驱动-IP-TCP-应用程序
    二、IP地址:
    1、使用IP协议通讯的主机都有IP地址,如:192.168.2.10
    2、在计算机中,IPv4地址用一个32位无符号整数表示

    一、端口号
    TCP/UDP协议使用16位整数存储端口号,所以每个主机拥有 65,535 个端口
    一些端口被IANA分配给指定应用
    21: FTP
    23: Telnet
    80: HTTP
    RFC 1700 (大约有2000个保留端口)

    二、TCP和UDP的区别
    1、TCP提供一种面向连接的、可靠的字节流服务
    2、UDP是无连接的、不可靠的数据协议报

    Socket套接字
    1)linux中的网络编程通过socket接口实现。Socket既是一种特殊的IO,一个完整的Socket都有一个相关描述
    {协议,本地地址,本地端口,远程地址,远程端口};每一个Socket 有一个本地的唯一Socket号,由操作系统分配。


    函数原型

    include<sys/socket.h>

    int socket(int domain,int type,int protocol)
    返回:成功返回描述符,出错返回-1

    参数:
    domain
    AF_INET IPv4因特网域
    AF_INET6 IPv6因特网域
    AF_UNIX unix域
    AF_UNSPEC 未指定

    protocol
    通常为0,表示按给定的域和套接字类型选择默认协议。

    type
    SOCK_STREAM 流式的套接字可以提供可靠的、面向连接的通讯流。它使用了TCP协议。TCP保证了数据传输的正确性和顺序性。
    SOCK_DGRAM 数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。使用数据报协议UDP协议。
    SOCK_RAW 原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。
    SOCK_SEQPACKET 长度固定、有序、可靠的面向链接报文传递

    字节序转换函数
    uint32_t hton(uint32_t hostlong)
    将一个32位整数由主机字节序转换成网络字节序
    uint16_t htons(uint16_t hostshort )
    将一个16位整数由主机字节序转换成网络字节序
    uint32_t ntohl(uint32_t netlong)
    将一个32位整数由网络字节序转换成主机字节序
    uint16_t ntohs(uint16_t netshort)
    将一个16位整数由网络字节序转换成主机字节序


    通用地址结构

    include<sys/socket.h>

    struct sockaddr{
    unsigned short sa_family; /* Internet地址族,AF_xxxx /
    char sa_data[14]; /
    14 bytes 的协议地址 */
    }
    sa_family 一般来说,IPV4使用AF_INET。
    sa_data 包含一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂溶在一起的
    在传递给需要地址结构的函数时,把指向该结构的指针转换成(struct sockaddr *)传递进去。


    因特网地址结构
    struct in_addr{
    in_addr_t s_addr /* ipv4地址 */
    }

    struct sockaddr_in{
    short int sin_family; /* Internet地址族如AF_INET(主机字节序) /
    unsigned short int sin_port;/
    端口号,16位值(网络字节序) /
    struct in_addr sin_addr; /
    Internet地址,32位IPv4地址(网络字节序) /
    unsigned char sin_zero[8]; /
    添0(为了格式对齐的填充位) */
    }


    IPv4地址族和字符地址间的转换

    include<arp/inet.h>

    const char *inet_ntop(int domain,const void *restrict addr,char *restrict str,socklen_t size);
    返回:成功返回地址字符串指针,出错返回NULL
    功能:网络字节序转换成点分十进制

    int inet_pton(int domain,const char *restrict str,void *restrict addr);
    返回:成功返回1,无效格式返回0,出错返回-1
    功能:点分十进制转换为网络字节序

    参数
    domain: Internet地址族,如AF_INET
    addr: Internet地址,32位IPv4地址(网络字节序)
    str: 地址字符串(点分十进制)指针
    size: 地址字符串大小


    填写IPv4地址族结构案例
    struct sockaddr_in sin; //定义一个sockaddr_in结构体
    char buf[16];
    memset(&sin,0,sizeof(sin)); //内存清零
    sin.sin_family = AF_INET; //填写Internet地址族
    sin.sin_port = htons((short)3001);//填写端口号(网络字节序)

    //填充sin_addr
    if(inet_pton(AF_INET,"192.168.2.1",&sin.sin_addr.s_addr)<=0){
    //错误处理
    }
    printf("%s\n",inet_ntop(AF_INET,&sin.sin_addr.s_addr,buf,sizeof(buf)));


    TCP客户端服务器编程模型
    服务器端调用序列
    调用socket函数创建套接字
    调用bind绑定本地地址和端口
    调用listen启动监听
    调用accept从已连接列队中提取客服连接
    调用I/O函数(read/write)与客户端通讯
    调用close关闭套接字

    客户端调用序列
    调用socket函数创建套接字
    调用connect连接服务器端
    调用I/O函数(read/write)与客户端通讯
    调用close关闭套接字

    服务器
    socket()                
    
    bind()
    
    listen()
                                    客服端
    accept()                        socket()
    
    阻塞,等待客户数 <- 建立连接 ----   connect()
    
    read() <------- 请求数据 -----  write()
    
    处理服务请求
    
    write() ------- 应答数据 -----> read()
    
    close()                         close()
    

    套接字与地址绑定
    绑定地址
    #include <sys/socket.h>
    int bind(int sockfd,const struct sockaddr *addr,socklen_t len);
    返回:成功返回0,出错返回-1

    查找绑定到套接字的地址
    int getsockname(int sockfd,struct sockaddr *restrict addr,socklen_t *restrict alenp);
    返回:成功返回0,出错返回-1
    
    获取对方地址
    int getpeername(int sockfd,struct sockaddr *restrict addr,socklen_t *restrict alenp);
    返回:成功返回0,出错返回-1
    

    建立连接
    服务器端
    #include <sys/socket.h>
    int listen(int sockfd,int backlog);
    返回:成功返回0,出错返回-1。backlog指定进行客服端连接排队的队列长度
    int accept(int sockfd,struct sockaddr *restrict addr,socklen_t *restrict len);

    客户端
    int connect(int sockfd,const struct sockaddr *addr,socklen_t len);
    返回:成功返回0,出错返回-1
    

    相关文章

      网友评论

          本文标题:网络分层模型及作用

          本文链接:https://www.haomeiwen.com/subject/fomsyttx.html