7.计算机网络

Posted lyndonmario

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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三次握手和四次挥手(详解)










以上是关于7.计算机网络的主要内容,如果未能解决你的问题,请参考以下文章

计算机网络

计算机网络分层模型 - 7层和4层

7.计算机网络

计算机网络:自顶向下方法 第一章笔记

深度学习:基于python:第7章 卷积神经网络

计算机网络原理-7