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三次握手和四次挥手(详解)
相关文章
相关标签/搜索