zoukankan      html  css  js  c++  java
  • Linux网络协议栈(一)——Socket入门(1)

    转自: http://www.cnblogs.com/hustcat/archive/2009/09/17/1568738.html

    1、TCP/IP参考模型
    为了实现各种网络的互连,国际标准化组织(ISO)制定了开放式系统互连(OSI)参考模型。尽管OSI的体系结构从理论上讲是比较完整的,但实际上,完全符合OSI各层协议的商用产品却很少进入市场。而使用TCP/IP 协议的产品却大量涌入市场,几乎所有的工作站都配有TCP/IP协议,使得TCP/IP 成为计算机网络的实际的国际标准。


    2、套接字(socket) 
    socket是操作系统的重要组成部分之一,它是网络应用程序的基础。从层次上来说,它位于应用层,是操作系统为应用程序员提供的API,通过它,应用程序可以访问传输层协议。
    1、socket 位于传输层协议之上,屏蔽了不同网络协议之间的差异;
    2、socket是网络编程的入口,它提供了大量的系统调用,构成了网络程序的主体;
    3、在Linux系统中,socket属于文件系统的一部分,网络通信可以被看作是对文件的读取,使得我们对网络的控制和对文件的控制一样方便。

    2.1、套接字地址
    在传输层上,通信端点可由Internet上3个参数描述:所用的协议、IP地址和端口号。这些内容由sockaddr描述:

    复制代码
    //usr/include/sys/socket.h
    typedef unsigned short    sa_family_t;
    //通用socket地址
    struct sockaddr {
        sa_family_t    sa_family;    /* address family, AF_xxx,协议簇*/
        char        sa_data[14];    /* 14 bytes of protocol address    */
    };

    //usr/include/netinet/in.h
    //INET地址簇的socket地址
    struct in_addr {
                        __u32 s_addr;
    };
    struct sockaddr_in   {
       sa_family_t            sin_family;      /* Address family: AF_INET */
       unsigned short int     sin_port;        /* Port number,端口*/
       struct in_addr         sin_addr;        /* Internet address,IP地址*/

       /* Pad to size of 'struct sockaddr' . */
       unsigned char sin_zero[sizeof (struct sockaddr) -
                              sizeof (sa_family_t) -
                              sizeof (uint16_t) -
                              sizeof (struct in_addr)];
    };
    复制代码

    Linux 支持的套接字地址族:

    套接字地址族

    描述

    UNIX

    UNIX 域套接字

    INET

    通过 TCP/IP 协议支持的 Internet 地址族

    AX25

    Amater radio X25

    APPLETALK

    Appletalk DDP

    IPX

    Novell IPX

    X25

    X25

    Linux 所支持的BSD套接字类型:

           BSD 套接字类型

     描述

    流(stream)

    这种套接字提供了可靠的双向顺序数据流,可保证数据不会在传输过程中丢失、破坏或重复出现。流套接字通过 INET 地址族的 TCP 协议实现。

    数据报(datagram)

     这种套接字也提供双向的数据传输,但是并不对数据的传输提供担保,也就是说,数据可能会以错误的顺序传递,甚至丢失或破坏。这种类型的套接字通过 INET 地址族的 UDP 协议实现。

    原始(raw)

     利用这种类型的套接字,进程可以直接访问底层协议(因此称为原始)。例如,可在某个以太网设备上打开原始套接字,然后获取原始的 IP 数据传输信息。

    可靠发送的消息

     和数据报套接字类似,但保证数据被正确传输到目的端。

    顺序数据包

     和流套接字类似,但数据包大小是固定的。

    数据包(packet)

     这并不是标准的 BSD 套接字类型,它是 Linux 专有的BSD 套接字扩展,可允许进程直接在设备级访问数据包。

      2.2、套接字操作
    套接字(更确切的说是BSD套接字)为应用程序提供了基本的API,这些API是编写网络应用程序的基础。

  • 相关阅读:
    Python 高级编程系列__03:python 中常见的内置类型
    Python 高级编程系列__02:type、object、class 的关系
    Python 高级编程系列__01:一切皆对象
    Mac 修改默认python的版本
    swap指令实现互斥
    什么是进程同步?wait( )是如何实现进程同步的?
    可执行文件加载时进行了哪些处理?
    C++不允许使用不完整的类型说明
    error LNK2019: 无法解析的外部符号
    抽屉原理——放苹果
  • 原文地址:https://www.cnblogs.com/jiujuan/p/9388515.html
Copyright © 2011-2022 走看看