zoukankan      html  css  js  c++  java
  • 网络IPC:套接字

    摘要:

    UNIX系统进程间通信机制(IPC),例如管道,FIFO,消息队列,信号量和共享存储,可以允许一台计算机上的进程通信。

    而套接字网络进程通信接口,不仅实现了一台计算机的通信,还能够进行网络进程间通信。

    一、四层协议栈

    数据链路层

    网卡接口的网络驱动程序,处理数据在物理媒介上的传输;不同的物理网络具有不同的电气特性,网络驱动程序隐藏实现细节,为上层协议提供一致的接口 数据链路层常用协议:地址解析协议(ARP)和反向地址解析协议(RARP),实现IP地址与机器物理地址(通常为MAC地址)之间的相互转换 网络层 实现数据包的路由和转发 常用协议:IP、ICMP

    网络层

    IP协议:逐跳发送模式;根据数据包的目的地IP地址决定数据如何发送;如果数据包不能直接发送至目的地,IP协议负责寻找一个合适的下一跳路由器,并将数据包交付给该路由器转发 ICMP协议:因特网控制报文协议,用于检测网络连接 传输层 为两台主机的应用程序提供端到端通信

    传输层

    使用的主要协议:TCP、UDP

    传输层 TCP:传输控制协议,为应用层提供可靠的、面向连接的、基于流的可靠服务;使用超时重发、数据确认等方式确保数据被正确发送至目的地

    UDP:用户数据报协议,为应用层提供不可靠的、无连接的、基于数据报的服务;不保证数据能正确发送

    应用层

    应用程序逻辑实现

    常用协议:ping、telnet、DNS、HTTP、FTP、DHCP等

    二、HTTP协议

    主要特点

    无连接:无连接是指每次连接只处理一个请求;服务器处理完客户请求,并收到客户应答后,即断开连接,节省传输时间

    无状态:无状态是指协议对于事务处理没有记忆能力;应答较快,但传输数据量较大

    HTTP URL:

    定位网络资源 http://host[:port][abs_path]

    HTTP请求

    由三部分组成:请求行、消息报头、请求正文

    格式:Method Request-URI HTTP-Version CRLF

    Method:请求方法,GET、POST等

    Request-URI:统一资源标识符

    HTTP-Version:请求的HTTP协议版本

    CRLF:回车换行

    HTTP响应

    由三部分组成:状态行、消息报头、响应正文

    状态行格式:HTTP-Version Status-Code Reason-Phrase CRLF

    HTTP-Version:服务器HTTP协议版本

    Status-Code:服务器返回的响应状态码

    Reason-Phrase:状态码的文本描述

    HTTP状态码

    状态代码有三位数字组成,首数字定义响应类别

    1xx:指示信息,表示请求已接收,继续处理;

    2xx:成功;

    3xx:重定向,要完成请求必须进行更进一步的操作;

    4xx:客户端错误,请求有语法错误或请求无法实现;

    5xx:服务器端错误,服务器未能实现合法的请求

    常见状态代码 200:OK,请求成功;400:Bad Request,请求有语法错误,不能被服务器所理解;401:Unauthorized,请求未经授权;403:Forbidden,服务器收到请求,但是拒绝提供服务;404:Not Found,请求资源不存在;500:Internal Server Error,服务器发生不可预期的错误;503:Server Unavailable,服务器不能处理客户请求

    三、套接字

    1. socket

    #include<sys/types.h>
    #include<sys/socket.h>
    int socket(int domain, int type, int protocal);

    参数:名空间、通信类型和协议

    名空间:AF_LOCAL,AF_UNIX(本地)或AF_INET(ipv4) AF_INET6(ipv6)

    通信类型:SOCK_STREAM(连接类型)或SOCK_DGRAM(数据报类型)

    协议:传递0,让系统自动选择协议(通常为最佳协议)

    返回值:套接字描述符

    2. bind

    #include<sys/types.h>
    #include<sys/socket.h>
    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    
    struct sockaddr {
        sa_family_t sa_family;
        char        sa_data[14];
    };
    /*ipv4*/
    struct sockaddr_in {
        sa_family_t sin_family;
        in_port_t sin_port;
        struct in_addr sin_addr;
    };
    struct in_addr {
        uint32_t s_addr;
    };
    /*ipv6*/
    struct sockaddr_in6 {
        sa_family_t sin6_family;
        in_port_t sin6_port;
        uint32_t sin6_flowinfo;
        struct in6_addr sin6_addr;
        uint32_t sin6_scope_id;
    }
    struct in6_addr {
        unsigned char s6_addr[16];
    }
    /*unix*/
    #define UNIX_PATH_MAX 108
    struct sockaddr_un {
        sa_family_t sun_family;
        char sun_path[UNIX_PATH_MAX];
    };

    3. listen/connect

    /*
    * @param backlog defines the maximum length to which the queue of pending connections
    */
    #include <sys/types.h>
    #include <sys/socket.h>
    int listen(int sockfd, int backlog);
    
    
    #include <sys/types.h>
    #include <sys/socket.h>
    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    4.accept

    #include <sys/types.h>
    #include <sys/socket.h>
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • 相关阅读:
    kubespray 容器存储设备 -- rook ceph
    RBAC 基于权限的访问控制 serviceaccount -- clusterRole clusterRoleBinding
    Kubernetes 1.10.4 镜像 版本
    rook 入门理解
    coredns CrashLoopBackOff 报错
    kubespray -- 快速部署高可用k8s集群 + 扩容节点 scale.yaml
    nginx反向代理 强制https请求 + 非root用户起80,443端口
    nginx rewrite flag
    CentOS7下双网卡iptables端口转发规则
    给php安装openssl扩展
  • 原文地址:https://www.cnblogs.com/pusidun/p/5725180.html
Copyright © 2011-2022 走看看