Linux 之网络基础部分

1、计算机网络:

  1. 在网络中表示一个进程: IP地址+端口号
    端口号:unsigned short 0–65535
    0–1024 范围的端口号是系统预留的 不允许普通用户使用
    1025–5000 各大公司使用
    5000以上 普通用户使用
  2. 协议:约定 规定 数据传输的控制方式;
  3. 网络协议模型:七层 四层
    发送数据:自定向下 封装;接受数据:自底向上 分用;
    下层为上层提供服务;
OSI七层网络模型       TCP/IP四层网络模型
  应用层                 应用层              为应用程序提供服务
  表示层                                     数据格式转化,数据加密
  会话层                                     建立、维护和管理会话
  传输层                 传输层               建立、维护和管理端到端的连接,控制数据传输的方式
  网络层                 网络层               在网络中的两个主机之间传递数据 对数据传输过程的控制
  数据链路层                                  提供介质访问和链路管理
  物理层                                      以二进制形式在物理媒介上传输数据
               网络接口层(数据链路层、物理层) 在两个物理设备上交换数据
 

 应用层           HTTP   FTP  Telnet   DNS   EMAIL   OSPF
 传输层                    TCP       UDP  SCTP
 网络层                          IP        ICMP
 网络接口层                 ARP      RARP
 
 路由器(网络层):尽力转发,并不保证数据绝对能够到达对端,尽力将数据传输出去;
 
 OSPF(开放最短路径优先)协议:是一种动态路由更新协议,用于路由器之间的通信,以告知对方各自的路由信息。
 DNS(域名服务)协议:提供机器域名到IP地址的转换。(如将www.baidu.com转化成百度的IP,
      输入域名就直接可以进入。因为IP地址记的时候太麻烦,就像每个人都是由身份证唯一标识的,
      但为了好记就起了名字。DNS就是一个将姓名与身份证对应的过程)
 telnet协议是一种远程登陆协议,使我们能在本地完成远程任务。
 HTTP协议(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式。
 TCP协议(传输控制协议):为应用层提供可靠的、面向连接的和流式服务。
 UDP协议(用户数据报协议):为应用层提供不可靠的、无连接的和数据报服务。
 SCTP协议(流控制传输协议)它是为在英特网上传输电话信号而设计的,这里不再细说。
 IP协议:(英特网协议)根据数据包的目的IP地址来决定如何将它发送给目标主机。
     如果数据包不能直接发送给目标主机,那么IP协议为它寻找一个合适的下一跳路由器,将数据包交给路由器来转发,
     多次之后数据包将到达目标主机,或者因发送失败而被丢弃。
 ICMP协议:是网络层的另一个重要协议,它是IP协议的重要补充,主要用于检测网络连接。
 ARP(地址解析协议):它实现IP地址到物理地址(通常是MAC地址,通俗的理解就是网卡地址)的转换。
 RARP(逆地址解析协议):顾名思义,它和ARP是相反的,它是实现从物理地址到IP地址的转换。
 ARP用途:网络层使用IP地址寻找一台机器,而数据链路层则是使用物理地址寻找一台机器,
      因此网络层必须先将目标机器的IP地址转化成物理地址,才能使用数据链路层提供的服务。
 RARP用途:RARP协议仅用于网络上的某些无盘工作站,因为缺少储存设备,无盘工作站无法记录自己的IP地址,
      然而通过RARP就可以看到从物理地址到IP地址的映射。

浏览器输入网址后发生了什么?

  第一步:在浏览器中输入www.baidu.com后,应用层会使用DNS解析域名,如果本地存有对应的IP,则使用;
         如果没有,则会向上级DNS服务器请求帮助,直至获得IP。域名解析详细过程会在下文讲到。
  第二步:应用层将请求的信息装载入HTTP请求报文,信息包含了请求的方法(GET / POST)、目标url、
          遵循的协议(http / https / ftp…)等,然后应用层将发起HTTP请求。
  第三步:传输层接收到应用层传递下来的数据,并分割成以报文段为单位的数据包进行管理,并为它们编号,
          方便服务器接收时能准确地还原报文信息。通过三次握手和目标端口建立安全通信。
  第四步:网络层接收传输层传递的数据,根据IP通过ARP协议获得目标计算机物理地址—MAC。
          当通信的双方不在同一个局域网时,需要多次中转才能到达最终的目标,
          在中转的过程中需要通过下一个中转站的MAC地址来搜索下一个中转目标。
  第五步:找到目标MAC地址以后,就将数据发送到数据链路层,
          这时开始真正的传输请求信息,传输完成以后请求结束。
  第六步:服务器接收数据后,从下到上层层将数据解包,直到应用层。
  第七步: 服务器接收到客户端发送的HTTP请求后,查找客户端请求的资源,
          将数据装载入响应报文并返回,响应报文中包括一个重要的信息——状态码,如200,404,500。

2、TCP 和 UDP 的编程流程:

  1. TCP 编程接口相关函数
int socket(int domain, int type, int protocol);
    domain: 协议簇    AF_INET
    type: 具体的协议类型   SCOK_STREAM    SOCK_DGRAM
                             TCP             UDP
    protocol: 下层具体协议  TCP/IP   默认为0
    返回值: 出错返回 -1     成功返回socket文件描述符
int bind(int listenfd, struct sockaddr* seraddr, socklen_t  len);
        返回值: 出错返回 -1   成功返回 0
        失败的原因: 1、IP地址不对   2、端口号被占用或者没有使用权限使用此端口号
   
   定网络中进程地址的结构为:
        struct sockaddr_in
        {
                sa_family_t  sin_family;    //地址族:AF_INET
                u_int16_t sin_port;         //端口号,要用网络字节序表示  5000以上
                struct in_addr sin_addr;    //IPv4结构体
        };
        struct  in_addr
        {
               u_int32_t s_addr;  //IPv4 地址,要用网络字节序表示
        }
int  listen(int listenfd, int size);
     size:指定内核维护的等待处理的连接队列的大小    经典值: 5
int accept(int listenfd, struct sockaddr* cli_addr, socklen_t *len);
     失败返回 -1  
     成功返回连接的文件描述符    >=0
 int recv(int fd, void *buff, size_t size, int flag);   ===>read
 int send(int fd, void *buff, size_t size,int flag);    ===>write
 int close(int fd);
 int connect(int sockfd, struct sockaddr *ser_addr, socklen_t len);
    建立连接  sockfd  客户端的socket套接字
             ser_addr    服务器端的地址信息    和那一个服务器建立连接
             len :addr的长度
  1. TCP的编程流程
1.服务器端:
     int listenfd = socket();      //listenfd  接收连接
     int res = bind();             //给listenfd绑定服务器的地址信息(IP地址+端口号)
     listen(listenfd, size);       //启动监听,开始接收客户端连接
     int c = accept(listenfd, , ); //获取一个客户端连接,c:与接收的客户端连接的文件描述符
     recv();     
     send(); //此两行:与一个客户端完成交互过程  //此三行:接收不同客户端的连接
     close();
  2.客户端:
       int sockfd = socket();  //创建用于网络通讯的socket文件描述符
       int res = connect();    //发起连接,与服务器建立连接
       send();
       recv();     //此两行:与服务器完成交互过程
       close();
  1. UDP编程接口相关函数

    int recvfrom(int socket, void *buff, size_t len,int flag, 
               struct socketaddr *src_addr, socklen_t  *len);
    int sendto(int sockfd, void *buff, size_t len, int flag
              struct sockaddr* dest_addr,  socklen_t len);
              指定数据发送给那个主机上的那个进程
    
  2. UDP编程流程:

 服务器:
 socket()     bind()    recvfrom();   sendto();    close();
 客户端:
 socket()   // bind()    sendto()     recvfrom()   close();
  socket()   只是指向本地的网卡

3、TCP & UDP & IP

  1. TCP与UDP的区别

    TCP: 面向连接的    可靠的    字节流服务
    UDP:    无连接      不可靠    数据报服务
    IP:    无连接      不可靠    无状态
    
  2. 面向连接的:(打电话)

     1.在通讯双方传递数据之前,必须建立连接;
     2.连接成功后,操作系统内核会为通讯双方分配资源,维护连接;
     3.在数据发送之后,必须断开连接,释放连接资源;
     4.同步通讯报文段的序号值;
     5.为数据传输的可靠性提供依据;
    
  3. 可靠的:

    数据能够安全的、完整的传输到对方;数据不丢失、不出错、不乱序、不重复;
    
  4. 字节流服务:

     1.数据没有发送与接收界限(send 的次数和 recv 的次数没有关系);
     2.发送方发送数据的次数与接收方接收数据的次数没有什么关系(一次 send  发送的数据在网络中通过几个 TCP 报文段传输是不确定的);
     3.如果一次 recv 没有将接受缓冲区中的数据读取完,则剩余的数据继续保持在接受缓冲区中。
    
  5. 无连接:(发短信)

    两个主机可以直接发送数据,不需要建立连接;
    
  6. 不可靠:

    UDP 不保证数据能够到达对端,不保证数据的完整性、正确性、乱序、重复;
    
  7. 数据报:(数据是一段一段的)

    1.发送方sendto的次数 和 接收方接收数据(recvfrom)的次数是相等的;
    2.sendto 一次发送的数据由接收方一次 recvfrom 获取;
    3.如果一次 recvfrom 没有将报文段中的数据读取完成,则剩余的数据会被丢弃。
    

TCP 需要进行三次握手建立连接后,才可以传输用户数据

  1. 无状态
数据的发送、传输、接收 相互独立的,没有上下文关系,接收端接收的数据有可能重复和乱序。
  1. TCP如何保证数据可靠性的???

     1.保证数据能传输到对端, 超时重传+确认机制   滑动窗口  拥塞控制
           慢启动   拥塞避免   快速重传   快速回复
        超时重传:TCP协议在发送数据以后,每一个报文段都会有一个定时器,
                 在定时器指定的时间内接受端对于这个报文段的确认报文如果没有到达,
                 则会重新发送一次,并且这次的定时器时间为上次的两倍;
        滑动窗口:TCP流量控制的一种手段,是指接收通告窗口,它告诉对方本端的TCP 
                 接收缓冲区还能容纳多少字节的数据,对方就可以控制发送数据的速度;
        拥塞控制:TCP 模块为了提高网络利用率,降低丢包率,并办证网络资源对每条
                 数据流的公平性而采取的控制手段。拥塞控制包含四部分内容:慢启动、
                 拥塞避免、快速重传、快速恢复;
         慢启动: 网络传输刚开始时,并不知道网络的实际情况,所以采取一种试探的
                 方式控制数据的发送速率。慢启动阶段,数据的发送速率以指数方式
                 增长,即就是拥塞窗口的增长,每次都是收到确认报文段数量的2倍;
                 可以看出慢启动并不慢,拥塞窗口增长的速度很快。所以,为其设置
                 了一个慢启动门限,当达到门限时,就进入到拥塞避免阶段;
        拥塞避免:当拥塞窗口的大小采用慢启动方式增长到慢启动门限时,就进入
                 拥塞避免阶段,拥塞避免阶段不再以指数形式增长拥塞窗口,而是
                 每经过一个往返时间RTT就将发送方的拥塞窗口+1, 使其增长速度
                 减缓。按照线性方式增长。如果发生网络拥塞,比如丢包时,就将
                 慢启动门限设为原来的一半,然后将拥塞窗口设置为 1,开始执行
                 慢启动算法。(较低的起点,指数级增长);
        快速重传:假设发送方发送的报文段分别为: M1,M2,M3,M4,M5,M6 , 当接收方收到 M1 和 M2 后,M3报文段丢失,
                  接着收到的 M4,M5,M6 都不做处理,而是没接收到一个报文段就对M2重复确认,发送方接收到重复的
                  三次确认报文段,就对其后的报文段进行重新发送,而不需要等待超时时间到达。
                  当快速重传后,立即进入到快速恢复阶段;
        快速恢复:将慢启动门限设置为原来的一半,然后将拥塞窗口
                 设置为现在的慢启动门限值,不再执行慢启动算法,而是直接进入
                 拥塞避免阶段。使发送窗口成线性方式增大
    
      2.保证数据不乱序、不重复
            32位序号:第一个报文段的序号是系统随机产生的一个随机值(ISN),
                    后续携带数据的报文段的序号值应该是  
                    随机值+报文段所携带数据的第一个字节在这个字节流中的偏移量;
       3.保证数据不失真
             16位 冗余检验码
    
  2. 实际选择那种协议,需要看需求,比如:
    视频传输,要求以恒定速率发送数据,UDP 可以做到;
    传输文件,要求可靠性,使用 TCP 好一些。

4、TCP 的面向连接过程:三次握手 四次挥手 状态转移
SYN : 请求建立连接,同步报文段;
ACK:确认报文段;
FIN : TCP报头的码位字段,该位置为1的含义为发送方字节流结束,用于关闭连接。
查看TCP的连接状态: netstat -natp
客户端在那个函数完成三次握手过程:connect

  1. 过程画图
    1.链接的过程 :三次握手过程 客户端主动发起链接

在这里插入图片描述

listen 函数之后,accept 之前,由系统内核来完成三次握手交互

  1. 断开连接的过程: 四次挥手过程

在这里插入图片描述!

  1. 三次握手的作用

    1. 使得通讯双方都做好通讯准备;
    2. 告诉对端,本端通讯所选用的报文标志号;
    3. 防止已失效的连接请求报文段又突然传递到了服务端,从而产生错误(防止 SYN 溢出攻击)。
    
  2. 三次握手那个阶段会出现异常 和 易受到攻击

    1. 第二阶段可能异常,如果服务器相应的端口未打开,会回复 RST 复位报文,
       握手失败;此外,listen 创建的监听队列达到上限,也可能失败。
    2. 比较典型的是  syn 泛洪攻击,或叫 syn 溢出攻击,即出现在第二阶段,
       如果客户机伪造大量第一次的 syn 同步报文,服务端就会依次耗掉很多资源
       来保存客户端的信息,并进行确认,实际确认后才认定失败,但失败是需要一定时间,
       因为服务端会连接多次进行第二次握手确认后才认定失败;那么短时间有大量 
       syn 同步报文涌向服务端,服务器资源可能被耗尽,就可能导致正常的客户端
       得不到响应而失败。
    
  3. 为什么是三次握手,两次可以

    两次显然不可能
    例如:已失效的连接请求报文段”的产生在 这样一种情况下:client 发出的
         第一个连接请求报文段并没有丢失,而是在某个网络结 点长时间的滞留了,
         以致延误到连接释放以后的某个时间才到达 server。本来这是一个 
         早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是
          client 再次 发出的一个新的连接请求。于是就向 client 发出确认报文段,
          同意建立连接。假设不采 用“三次握手”,那么只要 server 发出确认,
          新的连接就建立了。由于现在 client 并没有 发出建立连接的请求,因此不会
          理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的
          运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多
          资源 就白白浪费掉了。
    采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况, client 不会向 
    server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求
    建立连接。主要目的防止 server 端一直等待,浪费资源。 
    
  4. 挥手一般是四次为什么?挥手在某些情况下三次能完成吗?
    关闭连接的过程为四次挥手,由于 TCP 的全双工的通讯。所以每个方向都必须单独进行关闭。当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向的连接。收到一个 FIN 只意味着这一方向上没有数据流动,一个 TCP 连接在收到一个 FIN 后 仍能继续发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
    某些情况下,三次是可以完成挥手的,当本端关闭了连接,恰好也同时收到了对方 的 FIN 报文,此时可以把自己的 FIN 和给对端的确认 ACK 合在一起发送。就变成了三 次。

  5. TIME_WAIT 状态存在的意义?
    1.TIME_WAIT 状态是:主动断开连接的一端收到对端的 FIN 报文段并且将 ACK 报文段发出后的一种状态。
    2.意义:

    1) 保证迟来的报文段能被识别并丢弃。 
    2) 保证可靠的终止 TCP 连接。保证对端能收到最后的一个 ACK,
    如果 ACK 丢失, 在TIME_WAIT状态本端还可以接受到对端重传的FIN报文段
    并重新发送ACK。 所以 TIME_WAIT 的存在时间为 2MSL。 
    
  6. TIME_WAIT 和 CLOSE_WAIT 有什么区别?

    1.CLOSE_WAIT 是被动关闭的一端在接收到对端关闭请求(FIN 报文段)并且
    将 ACK 发送出去后所处的状态,这种状态表示:收到了对端关闭的请求,但是
    本端还没有完成工作,还未关闭。
    2.TIME_WAIT 状态是主动关闭的一端在本端已经关闭的前期下,收到对端的关闭请求
    (FIN 报文段)并且将 ACK 发送出去后所处的状态,这种状态表示:双方都已经完成
     工作,只是为了确保迟来的数据报能被是被并丢弃,可靠的终止TCP连接。 
    

5、HTTP 和 web 服务器

  1. 安全套接字(Secure Socket Layer, SSL)协议是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。
    1.特性
    ① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密。
    ② 鉴别:可选的客户端认证,和强制的服务器端认证。
    ③ 完整性:传送的消息包括消息完整性检查(使用MAC)。
    2.SSL位置
    SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头;
    3.工作原理
    SSL中,使用握手协议协商加密和MAC算法以及保密密钥 ,使用握手协议对交换的数据进行加密和签名,使用警报协议定义数据传输过程中,出现问题如何去解决。
  2. HTTP & HTTPS &DNS

1.都是应用层协议: HTTP: 超文本传输协议;HTTPS:安全的超文本传输协议,在 HTTP 基础上加入了SSL 协议 保证安全传输;HTTP 和 HTTPS 主要应用于 Web 浏览器和 网站服务器 之间传递数据,HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器 和 网站服务器之间的传输报文,就可以直接读懂其中的信息,因此 HTTP协议不适合传输一些敏感的信息,比如信用卡号,密码等。而 HTTPS 为了数据传输的安全,在 HTTP 协议的基础上加入了 SSL 协议,SSL 协议依靠证书来验证服务器的身份,并为 浏览器 和 服务器 之间的通信加密。

DNS 协议:域名解析协议;
DNS域名解析协议的工作原理: 递归式  迭代式
www.baidu.com -->通过DNS协议解析对应的IP地址+80(端口号)-->web服务器
浏览器     本地的IP地址      端口号
服务器     服务器的IP地址    端口号
浏览器发送HTTP请求报文段    -->web服务器
web服务器收到HTTP请求报文段   解析报文段  根据解析结果将 应答报文段 和 请求的页面 发送给浏览器
浏览器收到数据并呈现   HTML解析   json
service  httpd   ststus    查看运行状态
service  httpd   start      启动服务   80  系统预留端口,普通用户无权使用
service  httpd   stop      停止服务

2.HTTP 协议特点:

1)支持客户/服务器模式;
2)简单快捷,客户向服务器请求服务时,只需要传输请求方法和路径;
3)灵活,允许传输任意类型的数据对象;
4)无连接,即限制每次连接只处理一个请求,服务器处理完客户的请求并收到客户的回应后,断开连接;
5)无状态,即对处理事务没有记忆力;

2.HTTP 和 HTTPS 区别

DNS 协议:域名解析协议     解析方式:递归方式   迭代方式
1)HTTPS 协议需要申请 CA 证书,一般免费证书很少,需要交费;
2)HTTP 是超文本传输协议,信息是明文传输,HTTPS 是具有安全性的 SSL 加密传输协议;
3)HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口号也不一样 (HTTP: 80 ;  HTTPS:443);
4)HTTP 协议的连接简单,是无状态的;HTTPS 协议是由 SSL +HTTP 协议构成的可进行加密传输,
        身份认证的网络协议,比 HTTP 协议安全。
  1. HTTP 的请求方式和应答状态码的含义

HTTP的常用的请求方法

GET:请求获取资源;
POST:请求附加新的数据;
PUT:请求服务器存储一个资源;

HTTP 协议的响应

 响应由三个部分组成:状态行,消息报头,响应正文;

常用的应答状态码的含义:

 1XX: 指示信息,  表示请求已接收,继续处理;
 2XX: 成功,      表示请求已经被成功接收、理解、接收;
 3XX:  重定向,    要完成请求必须进行更进一步的操作;
 4XX:  客户端错误, 请求有语法错误或者请求无法实现;
*400:  客户端请求有语法错误,不能被服务器理解;
*401:  请求未经授权;
*403:  服务器收到请求,但拒绝服务;
*404:  请求资源不存在;
5XXX:  服务器端错误,  服务器未能实现合法的请求;
 *500: 服务器发生不可预期的错误;
 *503: 服务器当前不能处理客户端的请求,一段时间后可能恢复正常;
  1. 长连接和短连接

    长连接:多次请求可以共用一个连接;
    短连接:一次请求使用一个连接;
    
  2. cookie 和 会话 (Session)

       1、Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
       2、Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。
       3、Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。
       4、Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值