信息安全系统实现和设计第12周 -- -- 在Unix/Linux系统方案拟订第十三章中自学

      最后更新:2021-11-29 07:23:49 手机定位技术交流文章

      第十三章涉及TCP/IP和网络方案拟订。

      本章分为两节:TCP/IP和网络方案编制,第一部分涉及TCP/IP协议及其专门应用,第二部分涉及WEB和CGI方案规划。

      十三.1 TCP/IP议定书协定

      TCP/IP是互联网的基石。 TCP 代表传输控制协议。 IP 代表互联网协议。 目前,IP有两种形式的IP, IPv4 和 IPv6.IPv4 使用32 地址,而 IPv6 使用128 地址。 本节描述IPv4, IPv4仍然是最常见的IP版本。

      下图说明TCP/IP级别,以及每个级别的代表性组成部分和职能。

      13.2 IP主机、IP地址和IP协议

      (1) 主机是执行 TCP/IP 协议的计算机或设备之一,每个主机用32位IP 地址识别,简洁而言之,32位IP 地址号码通常用点表示,除了主机名之外,还可以使用点,在现实中,应用程序通常使用主机名而不是IP 地址,正常情况下,主机是执行 TCP/IP 协议的计算机或设备之一,每个主机用32位IP 地址识别,为简单起见,32位IP 地址号码通常用点表示,除了主机名之外,还可以使用点。在现实中,应用程序通常使用主机名而不是IP 地址。

      (2) IP地址分为两个部分,即网络ID字段和 HostID 字段。By District.IP 地址分为A-E类。交付到 IP 地址的软件包首先发送到与同一网络工作ID相同的路由器。路由器将通过 HostID 将软件包发送到网络中的特定主机。每个主机都有一个本地主机名称,即本地主机,带有默认的 IP 地址。

      (3) IP协议用于在IP主机之间发送/接收数据包。IP主机只需向接收者提供软件包,但不能确保将软件包转移到目的地或按顺序发送。 这意味着IP不是可靠的协议。

      (4) 每个IP数据包都有IP头、发件人IP地址、接收人IP地址以及数据。IP数据包的最大尺寸为64KB。IP数据包的最大尺寸为64KB。IP数据包的最大尺寸为64KB。IP数据包的最大尺寸包含关于该软件包的附加信息,例如软件包的总长度,软件包是使用TCP还是UDP,生存时间(TTL)计数,错误校验和等等。提供方IP数据包有一个IP头、发送人IP地址和接收人IP地址,以及数据。IP数据包的最大尺寸为64KB。IP数据包的最大尺寸包含关于该软件包的附加信息,例如软件包的总长度,无论是软件包使用TCP还是UDP,生存时间(TTL)计数,错误校验和等等。

      (5) 路由器可发挥特殊IP主机包功能,接收和传输数据包。

      联合民主党和TCP 13.3

      (1) UDP(用户数据报告协议)是IP上运行的一项协议,用于发送/接收数据报告,与IP一样,UDP不能保证可靠性,而是快速有效的,在可靠性并不关键的情况下可以使用。

      (2) TCP(传输控制协议)是用于发送/接收数据流的以连接为导向的协议,TCP也可在IP上运行,但提供一致的数据传输,通常,UDP类似于邮政邮件发送系统,但TCP类似于电话线。

      13.4 端口编号

      一个主机上的若干程序(程序)可同时使用TCP/UDP。

      应用程序 = (主机IP地址、协议和端口)

      协议是 TCP 或 UDP, 端口号是分配给程序的唯一未签名的短整数 。 要使用 UDP 或 TCP, 应用程序( process) 必须首先选择或获得端口号 。 保留了第一个 1024 端口号 。 其他端口号可供一般使用 。 应用程序可以选择可用的端口号, 也可以在操作系统中进行核分配 。

      13.5 网络和主机字节顺序

      在互联网上,数据总是按网络顺序排列,这是一个大端。在小端设备上,例如 PC、 htons ()、 htonl ()、 htonl ()、 hontohs ()、 nohs ()、 nohl () 和其他基于 Intel x86 的库函数上, 您可以在主机和网络序列之间转换数据。 例如, PC 中的端口号 1234 是按主机字节( 小端) 的未签名的短整数。 它必须转换为网络序列 。

      13.6 网络编程

      (1) 网络编程平台,使用者可选择是使用服务器用户账户进行编程,还是直接使用个人计算机设备。

      (2) 服务器-客户计算模型

      在服务器- 客户计算架构中, 我们首先在服务器主机上运行服务器程序。 然后我们从客户主机运行客户端。 在 UDP中, 服务器等待客户机的数据报告, 分析数据报告, 并对客户机提供回复。 在 TCP 中, 服务器等待客户端连接。 客户端首先连接到服务器, 以构建虚拟 c 。

      (3)套接字编程

      TCP/IP 用户界面在网络编程中实现,使用一些C语言图书馆功能和系统电话,通常称为 Socket API。 为了使用针刺API, 我们需要一个脚手架地址结构, 用来识别服务器和客户机。 我不知道, Netdb.h 和 sys/socketh 被定义为合成地址结构。

      1.套接字地址

      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;
      };
      

      * TCP/IP网络的罪恶家庭总是被配置为AF_INET。

      • Sin_port仓库网络港号,按字节顺序排列。

      • Sin addr是按网络字节顺序设置的主机 IP 地址。

      2.套接字API

      服务器必须构造一个同步并将其绑在由服务器 IP 地址和端口号组成的合成地址上。 它可以使用一个设定的端口号, 或者允许操作系统确定端口号( 如果 Sin 端口为零 ) 。 为了与服务器互动, 客户端必须创建一个套接字 。 使用 UPD 同步, 您可以将带连接到服务器 地址创建者, 您必须构建一个同步, 并将它绑在包含服务器 IP 地址和端口号的合成地址上。 它可以使用固定的端口号, 或者允许操作系统确定端口号( 如果 Sin 端口为零 ) 。 为了与服务器互动, 客户必须创建一个套接字。 对于 UPD 同步, 您可以将带绑链绑到服务器地址 。

      UDP套接字

      为了发送/接收数据报告,UDP Sockets使用发送()/接收()功能。

      ssize_t sendto(int soCkfd,const void *buf,size_t len,int flags,
      const struct sockaddr *dest_addr,socklen_t addrlen);
      ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,
      struct sockaddr *src_addr,socklen_t *addrlen);
      

      UDP套接字

      在生成和连接服务器地址后, TCP 服务器使用听( ) 并接受( ) 接收客户的连接 。

      int listen(int sockfd, int backlog);
      

      后遗迹参数设定了等待连接的最大队列长度。 听 () 指定袜子指定的合成为用于接收连接的合成 。

      int accept(int sockfd, struct sockaddr *addr, socklen t *addrlen)
      

      当被接受 () 系统建立时, TCP 服务器会被停止, 直到客户使用连接连接连接 。 它会提取第一个连接请求, 等待连接队列以监听 sockfd, 生成一个新的连接带, 并返回一个新的文件描述, 引用连接客户主机的绑带 。

      int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
      

      连接 () 系统函数将文档描述器 Sockfd 显示的程序连接到 adrr 提供的地址, 其大小由 sockfd 的地址空间决定 。
      如果 Sockfd 是 SOCK_ DGRAM 类型、 UDP 类型、 发送数据报告的默认地址和接收数据报告的唯一地址, 则SOCKfd 是 SOCK_ DGRAM 类型、 UDP 类型、 发送数据报告的默认地址和接收数据报告的唯一地址。 事实上, 这将限制 UDP 软件包与特定 UDP 主机之间的通信, 但很少使用。 因此, UDP 软件包的连接是可选择的或不需要的。 如果套接字是 SOCK_ STREAM 类型, 即 TCP 软件包, 连接到() 试图连接到给定添加的套接字。

      ref/ write () 和 send/ read ()

      TCP 两个主机都可以使用 Send()/ write() 传输数据, 并在连接时使用 recv()/ read() 接收数据。 唯一的区别是 Send() 和 recv () 中的旗号参数不同, 通常可以设置为零 。
      asize_t send(int sockfd, const void *buf, size_t len, int flags), asize_t write(sockfd, void *buf, size_t, len)
      ssize_t recv(int sockfd, void *buf, bize_t len, int flags); asize_t read(sockfd, void *buf, size_t len);
      通用套接字地址结构

      sockaddr
      struct sockaddr
      {
      uint8_t           sa_len;
      sa_family_t       sa_family;
      char              sa_data[14];
      };
      

      IPv6 Socket 地址结构
      IPv6 Socket 地址结构在<netinet/in.h>头文件中定义

      struct in6_addr
      {
      unit8_t s6_add[16];
      };
      #define SIN6_LEN
      struct sockaddr_in6
      { 
      uint8_t           sin6_len;
      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 sockaddr_storage足以容纳系统所支持的任何套接字地址结构。sockaddr_storage结构在<netinet/in.h>头文件中定义

      struct sockaddr_storage
      {
      uint8_t       ss_len;
      sa_family_t   ss_family;
      };
      

      13.7 网络和地理和地理资料组编程

      万维网(WW)或网络是互联网上通过超文本传输协议(RFC 2616199)传播信息的资源和用户的集合,从1990年代初期开始,随着因特网能力的提高,网络已成为全世界人民日常生活的重要组成部分。

      13.8 实践

      代码如下:

      #include <stdio.h>
      #include <stdlib.h>
      #include <sys/types.h>
      #include <sys/socket.h>
      #include <netinet/in.h>
      #include <arpa/inet.h>
      #include <time.h>
      #include <string.h>
      #include <unistd.h>
       
      #define MAXLINE 256
      #define PORT 6552
      void sys_err(char *msg){
          perror(msg);
          exit(-1);
      }
      int main(int argc , char **argv){
       
       
          int sockFd,n;
          char recvLine[MAXLINE];
          struct sockaddr_in servAddr;
       
          if (argc != 2) {
              sys_err("usage: a.out <IPaddress>");
          }
       
          sockFd=socket(AF_INET,SOCK_STREAM,0);
       
       
          memset(&servAddr,0,sizeof(servAddr));
       
          servAddr.sin_family = AF_INET;
          servAddr.sin_port = htons(PORT);
          if (inet_pton(AF_INET,argv[1],&servAddr.sin_addr) <= 0) {
       
              sys_err("inet_pton error");
          }
       
          connect(sockFd,(struct sockaddr *)&servAddr,sizeof(servAddr));
       
       
          while((n=read(sockFd,recvLine,MAXLINE)) >0 ){
              recvLine[n] = '';
              if(fputs(recvLine,stdout) == EOF){
                  sys_err("fputs error");
              }
          }
          if(n <0){
              sys_err("read error");
          }
          return 0;
      }
      

      实践结果:

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/13888.html

          热门文章

          文章分类