zoukankan      html  css  js  c++  java
  • 7.计算机网络

    一.计算机网络
     1.什么是计算机网络:它是计算机技术和通信技术相结合的产物。
     2.计算机网络的功能:
      a.数据通信
      b.资源共享
      c.提高系统的可靠性
      d.分布式网络处理和负载均衡
     3.计算机网络的组成
      1.通信子网络:由网卡,线缆,集线器(存粹物理上的),中继器,交换机(),路由器(网络之间的交流)
      2.资源子网络:网络中的计算机,打印机等一些可以提供的设备
      3.计算机网络软件
       协议软件:它规定了计算机之间通信的准则,最常见的协议TCP/IP协议簇
       网络通信软件:网络中实现计算机于设备之间通信的软件
       网络操作系统:可以提供网络服务的计算机操作系统,常见的网络操作系统,windows server2008(使用简单,有图形界面,鼠标操作,不太稳定) UNIX Linux
       网络管理软件和网络应用软件:
        管理:防火墙,SELinux
        应用:浏览器,迅雷,ftp客户端
         4.计算机网络的分类
          1.网络的作用范围来分
           局域网
           城域网
           广域网
          2.按网络的传播技术来划分
           广播式网络
           点到点网络
          3.传输介质划分
           有线网,无线网,微波通信,卫星通信
         5.计算机网络的拓扑结构
          1.星型拓扑结构
          2.树形拓扑结构
          3.总线型拓扑结构
          4.环形拓扑结构
          5.网状型拓扑结构
         6.计算机网络的发展过程
          1.以计算机为中心的联机系统
          2.分组交换网络的诞生
          3.网络体系结构与协议标准化
           20世纪八十年代,ISO组织提出 开放式系统互连参考模式(OSI),这个模型照顾到了各方的利益,所以太过庞大,因此至今没有推出成熟的产品,TCP/IP符合OSI标准的协议
           异构:操作系统(windows) ->socket->TCP/IP ->TCP/IP -> socket ->Linux
           4.高速计算机网络
         7.网卡:网络接口卡或网络适配器,它负责讲数据发送到网络中去,也负责从网络中获取数据,每一张网卡上会有一个独一无二MAC地址
         8.OSI/RM结构与TCP/IP模型
          OSI/RM结构七层:      物理层,数据链路层,网络层, 传输层, 会话层, 表示层,应用层
          TCP/IP模型四层结构:物理层,                      网络层, 传输层, 应用层(间隔顺序表示两者相对应的部分)
          物理层:负责通信网络收发数据包
          网络层:选择,流量控制,与网络拥塞问题,IP协议式该层的核心
          传输层:机器之间建立端到端的连接(用于数据间的传输),该层的核心协议TCP/UDP
          应用层:主要为用户提供针对性的服务,该层代表性的协议有:HTTP(超文本传输),SMTP(邮件传输),FTP(文件传输),TELNET(远程登陆)
         9.IPv4地址
          在计算机网络中的每一台计算机都必须有一个唯一的标识符,它就是IP地址。目前由4个不超过255的整数组成,一般用点分十进制表示
          ip地址的分类:
           A类:
            第一二进制位必须是0()
            0.0.0.0
            127.255.255.255
            公网的地址
           B类:前两位的二进制位必须是10
            128.0.0.0.0
            191.255.255.255
            大型的,大企业中的网络
           C类:前三位的二进制位必须是110
            192.0.0.0
            223.255.255.255
            小公司的网络
           D类:前四位的二进制必须是1110
            224.0.0.0
            239.255.255.255
            家庭,小公司的
           E类:前五位的二进制必须是1111
            240.0.0.0
            255.255.255.255
         10.公有IP和私有IP
          公有IP:在网络服务提供商登记过的IP地址叫公有IP
          私有IP:由一些公司自己分配的,不能在网络上公开直接访问的IP地址
         11.子网掩码:目前由4个不超过255的整数组成,一般用点分十进制表示(255.255.255.0)
          子网掩码&ip地址 = 网络地址
          如果两个人ip地址的网络地址相同,那么说明它们在同一个子网内,就可以直接通信而不需要路由
         12.网关地址:负责子网出口的计算机,一般由路由器担任(路由器就是一台具有路由功能的计算机)
         13.端口号:操作系统为需要通信的进程分配一个独一无二的编号,端口号可以确定与哪个进程进行通信
          1-1024基本上已经被操作系统占用了,一般编程要使用1024以上的。
          http:80
          ftp:21
          telnet:23
    二.套接字(socket:插座)
     是一种可以进行网络通信的内核对象,它有一个唯一的标识符,一般称它为socket描述符,跟文件描述符类似,也可以用read/write/close操作
           #include <sys/types.h> /* See NOTES */
           #include <sys/socket.h>
           int socket(int domain, int type, int protocol);
           功能:创建socket对象
           domain:通信地址类型
              AF_UNIX/AF_LOCAL:本地进程间通信
              AF_INET:使用ipv4地址通信
              AF_INET6:使用ipv6地址通信
           type:
            SOCK_STREAM:数据流协议TCP,面向连接的通信协议
             优点:安全可靠,数据不丢失,但是速度慢
             一般常用于安全性较高的领域,但是速度不要求的场景下
            SOCK_DGRAM:数据报协议UDP,面向无连接的通信协议
             优点:速度快,数据可能丢失,安全性可靠性与TCP相比不高。
             一般用于安全性要求不高,但是对速度有要求的场景
            protocol:特殊协议一般不使用,一般写0就好
            准备通信地址
             基本的通信地址
               struct sockaddr {
                   sa_family_t sa_family;
                   char sa_data[14];
               }
               本地通信地址
               struct sockaddr_un
               {
                 //通信地址类型
                  sa_family_t sun_family;
                  //socket文件路径
                  char sun_path[108];
               }
               网络通信地址
               struct sockaddr_in
               {
                 //通信地址类型
                 short int sin_family;
                 //端口号
                 in_port_t sin_port;
                 //ip地址
                 struct in_addr sin_addr;
               }
    三.本地socket进程间通信
     A(B的地址+消息内容) -> B
     B(A的地址+消息内容) -> A
     进程A:创建socket -> 准备地址 -> 绑定 -> 连接 -> 接收/发送 -> 关闭socket -> 删除socket文件
     进程B:创建socket -> 准备地址 -> 连接 -> 绑定 -> 发送/接收 -> 关闭socket
     进程B可以给进程A发送消息,进程B也可以给进程A发消息
     一个socket文件只能绑定一个地址
           int bind(int sockfd, const struct sockaddr *addr,
                    socklen_t addrlen);
           功能:把socket对象与通信地址(自己)建立联系
           int connect(int sockfd, const struct sockaddr *addr,
                       socklen_t addrlen);
           功能:与通信目标连接(与目标主机的地址)
    四.网络通信(UDP)
              点对点通信(C to C)
              网络通信地址
               struct sockaddr_un
               {
                 //通信地址类型
                 short int sin_family;
                 //端口号
                 in_port_t sin_port;
                 //ip地址
                 struct in_addr sin_addr;
               }
        生成端口号:个人计算机可能是大端,也可能是小端,网络通信时,需要大端数据,必须把数据转换成大端
           端口号就是一个16位的无符号整数
           uint16_t htons(uint16_t hostshort);
           #include <arpa/inet.h>
           uint32_t htonl(uint32_t hostlong);
           //功能:把32位主机字节序转换成32位网络字节序
           uint16_t htons(uint16_t hostshort);
           //功能:把16位主机字节序转换成16位网络字节序
           uint32_t ntohl(uint32_t netlong);
           //功能:把32位网络字节序转换成32位主机字节序
           uint16_t ntohs(uint16_t netshort);
           //功能:把16位网络字节序转换成16位主机字节序
        生成IP地址:
           #include <sys/socket.h>
           #include <netinet/in.h>
           #include <arpa/inet.h>
         in_addr_t inet_addr(const char *cp);
         功能:把点分十进制的IP地址转换位32位无符号整数
            char *inet_ntoa(struct in_addr in);
            功能:把32位的网络字节序的ip地址转换成点分十进制的字符串地址
           ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                            struct sockaddr *src_addr, socklen_t *addrlen);
           功能:接收数据,并获取发送端的地址
           ps:addrlen是参数不是返回值
           ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                          const struct sockaddr *dest_addr, socklen_t addrlen);
            功能:发送数据到指定的目标
            进程A:创建socket对象 -> 准备地址 -> 绑定 -> 接收数据和来时的地址 -> 原路返回数据 ->关闭
            进程B:创建socket对象 -> 准备地址 -> 向目标发送数据 -> 接收数据 ->关闭socket
            当socket对象被全部关闭后会在内核中,停留一段时间(给一个重新连接的机会),如果再使用同样的ip地址和端口号就会失败(延时关闭)
    五.网络通信(TCP)
     一对多连接(c to s)
     面向连接的网络通信,在通信过程中时刻保持连接,这种通信方式类似于打电话,这种通信方式能保证安全可靠数据不丢失,但是与udp相比,它的传输速度略低。
     进程A :创建socket —> 准备地址 —> 绑定 —> 监听(设置队列长度) —> 等待连接 —> 进行通信 —> 关闭
     进程B :创建socket —> 准备地址 —> 连接 —> 通信 —> 关闭
           int listen(int sockfd, int backlog);
           功能:设置最大的监听数量
           int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
           功能:等待其他主机与当前socket建立连接关系
           返回值:建立好的连接的描述符,此后通信都用此描述符
           ssize_t recv(int sockfd, void *buf, size_t len, int flags);
           功能:网络通信专用的数据接收
           ssize_t send(int sockfd, const void *buf, size_t len, int flags);
           功能:网络通信专用的数据发送
           当recv/send函数的返回值为-1时,连接断开,此时应该结束死循环
           练习:开启一个服务端程序(创建socket,准备地址,绑定,等待连接,创建进程为连接服务器,主进程继续等待连接)
             客户端程序(创建socket,准备地址,连接,与服务端通信)
           为什么是三次握手:
           什么是安全的连接(A要知道:A->B,&& B->A,B要知道:A->B, && B->A)
           而这样的三次连接就保证了A和B都知道了上述信息

    三次握手:

    四次挥手:

    1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
    这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你不可以马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
     
    2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
    这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
    TCP三次握手和四次挥手(详解)


  • 相关阅读:
    使用JavaScript让网页title动起来 TC
    Asp.net获取客户端登录者mac地址 TC
    HTTP错误 500.23Internal Server Error 检测到在集成的托管管道模式下不适用的ASP.NET设置 TC
    上下文字\图片滚动 无JS TC
    SQL语句优化(雷人代码) TC
    js获得url请求参数 TC
    HTTP状态码 TC
    Javascript之表格隔行变色 TC
    C# FTP上传文件报550异常解决方案 TC
    javascript 点击固定数据 隐藏或显示DIV TC
  • 原文地址:https://www.cnblogs.com/LyndonMario/p/9409383.html
Copyright © 2011-2022 走看看