linux 网络编程 1---(基本概念)

1.TCP和UDP协议

    共同点:同为传输层协议

    不同点: TCP:有连接,可靠

        UPD 无连接,不保证可靠

    TCP(即传输控制协议):

       是一种面向连接的传输层协议,它是能提供高可靠性通信(即,数据无误,数据无丢失,数据无失序、数据无重复到达的通信)

       适用情况:

          适合于对传输质量要求较高,以及传输大量数据的通信。

          在需要可靠数据传输的场合,通常使用TCP协议

          QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议

    UDP(User Datagram Protocol)用户数据报协议

        是不可靠的无连接协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

        使用情况:

        发送小尺寸数据(如对DNS服务器进行IP地址查询时)

        在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)      

        适合于广播、组播式通信中。

        MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议

        流媒体、VOD/VoIP/IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输。

2.socket

    是一个编程接口

    是一种特殊的文件描述符(everything in Unix is a file) 

    并不仅限于TCP/IP协议

    面向连接(Transmission Control Protocol  Protocol    -TCP/IP)

    无连接(User Datagram Protocol  -UDP 和 Inter-network Packet Exchange  -IPX)

    

    Socket类型:

      流式套接字(SOCK_STREAM)

        提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看做是字节流,无长度限制。(TCP)

      数据报套接字(SOCK_DGRAM)

        提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收(UDP)

      原始套接字(SOCK_RAM)

        可以对较低层次协议如IP、ICMP直接访问。(如  Ping )

3.IP地址

   IP地址是Internet 中主机的标识

   IP地址为32位(IPv4)或者128位(IPv6)

   ipv4表示形式:点分十进制,例如:192.168.1.123

   IP地址分类(根据ipv4前八位来区分):

    A类   0000 0000  - 0111 1111   0.x.x.x   -  127.x.x.x

    B类   1000 0000  - 1011 1111   128.x.x.x - 191.x.x.x

    C类   1100 0000 -  1101  1111   192.x.x.x  -  223.x.x.x

    D类    1110 0000  - 1110  1111   224.x.x.x  -  239.x.x.x   组播地址

    E类     1111 0000  -  1111  1111  240.x.x.x  -  255.x.x.x 保留测试

    192.168.x.x  属于局域网Ip地址,可以砸任意一个ip地址下使用路由器分配地址

      以192.168.1.x为例:

        192.168.1.255  广播地址

        192.168.1.0  表示网络号

        192.168.1.1  表示网关

      127.x.x.x   属于本机地址

    子网掩码:可以用于得到当前最大的主机连接数

      A类:255.0.0.0  0~24

      B类:255.255.0.0  2~16

      C类:255.255.255.0  2~8

    #include<arpa/inet.h>

     将点分十进制ip地址转化为网络字节序的整形数据

     in_addr_t    inet_addr(const char *cp);

     将网络字节序的整形数据转化为点分十进制ip地址

      char * inet_ntoa(struct in_addr in);

      例子:

        inet_addr("192.168.1.123");

 4.端口号

   为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别

   TCP端口号与UDP端口号独立

   端口号一般由IANA(Internet Assigned Numbers Authority) 管理

   众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)

   已登记端口:1024~49151
   动态或私有端口:49152~65535

   使用 vi /etc/services 可以查看已经使用的端口号

   一般使用 5555、6666、7777、8888、9999、10001、10000

5.字节序

  不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO):
  小端序(little-endian)
    低序字节存储在低地址,将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;

  大端序(big-endian)
    高序字节存储在低地址,将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola等所采用

    如何测试主机字节序:
      方法1:使用指针
      方法2:使用file命令, file a.out,其中LSB的L为小端存储
      方法3:使用共用体

  网络字节序:大端存储

    主机字节序和网络字节序转换接口:

      #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);

      例子:
      htons(9999);

          

猜你喜欢

转载自www.cnblogs.com/jiaan/p/9416021.html