计算机网络-(三)

OSI七层参考模型及个模型下的协议

应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

应用层:用户与计算机的接口、比如用户使用的浏览器、ftp下载工具、邮件、微信、QQ、今日头条客户端等。
TFTP    FTP   NFS    WAIS
表示层:完成数据的转换,比如GB2312编码到UTF-8的转换,还有数据压缩与解压缩等。
Telnet   Rlogin    SNMP    Gopher
会话层:提供通信双方会话的建立、维持、释放
SMTP   DNS
传输层:传输数据报,通过端口号标识应用层的应用程序。提供面向连接的TCP服务或者无连接的UDP服务,实现端到端的通信。
TCP    UDP
网络层:传输IP报文,通过IP地址标识通信双方,实现主机到主机的通信。通信路由转发等方式找到通信双方。
IP     ICMP   ARP   RARP    AKP   UUCP
数据链路层:传输数据帧、通过MAC地址标识通信双方。常用的通信协议有以太网的802.11、家庭的GPON、广域网的PPP、FDDI、ATM等。
FDDI   Ethernet    Arpanet    PDN    SLIP    PPP
物理层:传输0,1这样的比特流,对用户是透明的。有很多物理层的标准,规定了物理层的电气特性比如办公用的网线、家庭用的光猫等。
IEEE 802.1A    IEEE 802.11

TCP/IP四层模型

OSI七层参考模型是理论模型,实际应用的是TCP/IP四层模型,对应关系如下图所示,关于各层的功能同上:

应用层:对应OSI的应用层、表示层、会话层
    代表硬件/软件:应用程序     代表协议/技术:HTTP/HTTPS、DNS、NAT/NAPT、FTP/SFTP、SMTP
传输层:通OSI
    代表硬件:操作系统         代表协议:TCP、UTP
网络层:通OSI
    代表硬件:操作系统、路由器    代表协议:IP
网络接口层:同OSI的数据链路层和物理层
    代表硬件:数据链路层(网卡驱动程序、交换机)、物理层(网线、集线器)

应用程序实现对应用层的封装分用 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容;(下四层封装分用)对于一台路由器,它实现了从网络层到物理层;(下三层分装分用) 对于一台交换机,它实现了从数据链路层到物理层;(下两层分装分用) 对于集线器,它只实现了物理层。

对封装分用的理解:

1,封装:发送数据时,从高到低的顺序,按照对应的网络分层协议对数据进行包装。

从应用程序开始发送数据:
应用层:http,数据
传输层:TCP,http,数据
网络层:IP,TCP,http,数据
数据链路层:以太网首部,IP,TCP,http,数据,以太网尾部
物理层:0/1

2,分用,封装的逆过程:接收数据时,从低到高的顺序,按照对应的网络分层协议,解析数据。

网络数据传输

<1>局域网

(1)认识IP和MAC

IP:

IP的格式:xxx.xxx.xxx.xxx IP由 四个部分组成,每个部分都是0-255 网络号:前三个部分组成(用来标识网段),前三个部分相同,标识在一个网段中。 主机号:最后一个部分用来标识主机号 IP分为A-E五大类,部分范围是局域网IP,部分是广域网,可以根据规范,知道某个IP是局域网IP还是公网IP

注意:局域网内(局域网IP):网段唯一,同一个网段,主机号唯一

公网(公网IP):公网IP是唯一的

MAC:

和网卡硬件绑定的,全球唯一 作用:网络数据传输定位网卡硬件的位置,一个主机可能有多个网卡(例如蓝牙连接、无线连接、有线连接网卡),电脑硬件定位发送的目的只能使用MAC

总结:

IP地址描述的是路途总体的起点和终点。(给人用的,网络主机的逻辑地址) MAC地址描述的是路途上的每一个区间的起点和终点(给电脑硬件用的,网络主机的物理地址)

(2)网络数据传输的特性

1.IP,MAC的作用

2.封装分用——发送数据从高到低封装,接受数据从低到高分用

3.结合IP,MAC,理解网络数据传输,本质上是一跳一跳的传输数据

首先根据目的主机发送HTTP请求,从源IP发送数据到目的IP 从源MAC(1)发送数据到目的MAC(2),然后MAC(2)对数据进行封装和分用,再以MAC(2)为源MAC,目的MAC为MAC(3),以此,发送数据到最终目的MAC。 注意:接收数据报的主机:可能在一些情况下(广播或者转发),出现目的MAC不是我,我也能收到的情况。

五元组:

源IP,目的IP,源端口,目的端口,协议号

IP:标识主机,给人用
源IP:发送数据的主机
目的IP:接受数据的主机
​
端口号:
源端口:标识发送数据的进程
目的端口:标识接收数据的进程
协议号:进程需要封装,解析数据报的数据格式

DNS协议:

作用:域名转IP 主机/路由器:都存在DNS缓存 域名查询的方式:树形结构从下往上查找(缓存,域名服务器)。 先在主机/路由器的DNS缓存中找,如果找不到,依次向上 特殊的IP,域名:本机IP为127.0.0.1,本机域名为localhost

(3)网络数据传输流程

ARP/RARP协议:

主机中有ARP缓存表 ARP协议:IP转MAC RARP协议:MAC转IP

注意:交换机和集线器自己是没有MAC地址的,都是通过转发(不会修改源MAC和目的MAC),交换机有MAC地址转换表,可以根据MAC找到对应的端口,而集线器没有这个功能

(1)网络互联的方式

首先介绍线器数据传输时,直接转发到其它所有端口(工作在物理层)

网络数据传输的过程

1,ARP缓存表找到了

1.主机1发送数据到主机3(http://主机3:80)

2.主机1查找本机的ARP缓存表,根据ARP协议,找到目的MAC

3.数据报由主机1,发送到集线器(数据报中的源MAC(主机1),目的MAC(主机3)真实的数据报

4.集线器转发数据报到除主机1的其他所有相连的主机(主机2,主机3)

5.主机2接收:数据报中,目的MAC不是我,丢弃 主机3接收,数据报中,目的MAC是我,接收 目的IP是我,交给对应端口处理,如果不是我,执行上述网络传输(一跳一跳的过程)

2,ARP缓存表没找到

1.主机1发送数据到主机3,http://主机3:80

2.主机1查找本机的ARP缓存表,发现找不到

3.主机1发送广播数据报(非真实数据,只是要求对应主机返回MAC:我要IP为主机3的MAC,谁是主机3,快告诉我)

4.集线器转发到主机2,主机3

5.主机2接收:要求的IP不是我,丢弃 主机3接收:要求的IP是我,返回我的MAC

6.主机1收到主机3的返回数据(IP,MAC)更新自己的ARP缓存表

7.主机1发送真实的数据到主机3

注意:使用集线器的缺陷 网络冲突,这样构成的网络区域叫冲突域/碰撞域(例如,房间里有多个人说话,那么其中某一个人说话就听不清楚了)

(2)局域网交换机组网的方式

首先介绍交换机,交换机的作用: MAC地址转换表:保存连接的主机MAC和端口的映射,目的MAC是谁,直接转发到对应的端口(不像集线器,发送到所有端口),不会产生冲突域。

1.主机1发送数据到主机3 ,http://主机3:80

2.主机1查找本机的ARP缓存表,如果找到,主机1发送数据到主机

3.如果找不到,发送广播数据报,让IP为主机3的告诉我,你的MAC 3.交换机转发到其他所有端口(广播)

4.主机2丢弃,主机3返回自己的MAC

5.交换机知道主机3的MAC,主机1知道主机3的MAC(更新ARP缓存表)

注意:上述五个步骤,都是根据IP找MAC,和集线器的流程相似,下面的步骤时根据MAC找端口

6.主机1发送真实数据给交换机

7.交换机查找自己的MAC地址转换表,通过MAC找端口,发送数据到对应的端口

8.主机3接收,目的MAC是我,目的IP也是我 这种网络数据传输的方式就像:先问张三的手机号,再打电话给张三,对别人没有影响

(3)局域网交换机+路由器组网的方式

注意:单独由路由器组网的方式,和上述由交换机单独组网的方式相同 首先介绍路由器,这里介绍两种: <1>LAN口连接局域网,为主机分配局域网IP,分配的局域网IP都是一个网段(路由器下连接多个主机的类型) 路由器还有个网卡:绑定局域网的IP,和下面连接的主机进行信息交互用的 <2>LAN口是网卡。每个LAN口都可以连接类似交换机组网的方式

第二种路由器组网方式:

1.主机1发送数据到主机2:http://192.168.2.y:8080/xxx

2.通过目的IP+子网掩码,计算出目的主机和本机是否在一个网段

3.如果是,不需要使用路由器,和上述使用交换机组网方式一样

4.如果不是,表示我主机1和交换机处理不了,要发送给网关转发(网关就类似于IP的管理者,能查询其他主机的IP)

5.数据报发送给网关设备目的MAC:通过路由器网关的IP在主机1的ARP缓存表中,获取网关的MAC

6.路由器接收到数据报,分用:物理层到网络层,网络层分用,所有可以获取到目的IP

7.路由器查找自己的ARP缓存表(IP找MAC)

8.找不到,路由器发广播,主机2在哪,告诉我你的MAC

9.有了MAC,直接发到主机3

<2>广域网传输流程

1,NAT和NAPT

NAT协议:局域网IP映射公网IP NAPT协议:局域网IP+局域网端口映射--->公网IP+公网端口

2.传输流程

(1)首先主机1发送http请求,使用DNS协议:进行域名转IP 域名转IP:首先在本机DNS缓存表找,如果找不到--->向上查找--->如果根域名服务器也找不到,表示公网上没有该域名的主机.

(2)找到IP,数据报IP部分,PORT部分都有了。

(3)根据目的IP计算是否和主机在同一个网段 主机1的IP+子网掩码 计算出-——>主机1的网段 目的IP+子网掩码 计算出--->目的主机的网段 通过上述计算,判断目的IP和主机是否在同一个网段

(4)如果是同一个网段,和局域网传输一样, 如果不是一个网段:发送数据到网关 找网关MAC

(5)找到网关的MAC之后,将HTTP数据重新封装,交由交换机转发 交换机转发:在MAC地址转换表(MAC映射端口),通过目的MAC找端口(交换机的屁股口) 注意:这个过程没有封装和分用 注意:前五个步骤,和路由器组成的局域网传输流程一样 参考:局域网传输

(6)路由器接受,分用数据报 注意:路由器会根据最短路径算法,计算出下一个发送数据的设备,会离目的IP更近一步

(7)上述步骤之后,数据报由局域网到广域网进行传输

(8)数据到达服务器后,响应数据,

(9)数据由百度服务器返回,路上经过的设备传输流程和步骤七相同

(10)路由器接收响应数据(对接收的数据进行分用,修改,封装)

(11)之后的步骤,和局域网传输相同 主机接收数据报,分用

UDP和TCP

<1>UDP协议:

UDP协议端格式:

        16位源端口号             16位目的端口号             共8
        16位UDP长度              16位UDP检验和             字节
        
                                数据

16位UDP校验和作用:类似于藏头诗,双方约定好的校验数据,进行数据校验

UDP的特性:

1,无连接:没有建立连接

2,不可靠:没有类似TCP保证数据传输的安全机制,(连接管理机制,确定应答机制,超时机制)效率更高。

3,面向数据报:只能一次接受(系统级别的操作:调用系统函数)

4,没有发送缓冲区(发了消息就不管),有接收缓冲区

5,数据最大为64k

发送缓冲区:主机1发送完数据,发出之后就不管了 接收缓冲区: 如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom, 每次接收10个字节; 所以,接收数据的时候,发送100个字节,系统读取只调用一次,但是可以读取多次发来的其他100字节。 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;

<2>TCP协议(可靠的传输协议)

(1)TCP相关的概念

TCP协议:可靠的传输协议,安全,效率(有连接的可靠传输协议) 设计TCP协议的理念:非100%安全,保证可承受范围内的安全,尽可能的提高网络传输数据的效率 TCP协议的格式:

            16位端口号              |                  16位目的端口号
                                32位序号
                                32位确认序号
        4位首部长度 | 保留(6位)(6位标志位)               16位窗口大小
        16位校验和                  |                  16位紧急指针
                                  选项
                                  
                                  数据

6位标志位:

URG:紧急指针是否有效

ACK:确认号是否有效

PSH:提示接受端应用程序立刻从TCP缓冲区把数据带走

RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段

SYN:请求对方建立连接,我们把携带SYN表示的称为同步报文段

FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段 重点掌握ACK,SYN,FIN

(2)确认应答机制

主机A发送数据给主机B,每个数据都带了数据序号,主机B返回ACK应答 每一个ACK都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据; 下一次你从哪里开始发

作用:

1.保证安全:保证‘我’发送的消息,对方必须确认并恢复

2.保证多条数据确认信息的安全(告诉发送者,这次回应是对哪些数据,下次数据发送应该从什么时候开始)

(3)超时重传机制(安全机制)

超时重传机制触发:

主机A发送数据给主机B,如果主机A在一个特定的时间间隔内没有收到来自主机B的确认应答,就会进行数据重发。

没有收到确认应答的情况:

1.主机A的数据报在发送的过程中丢了。

2.主机B的ACK应答丢了

超时时间的确定:TCP会根据当时的网络状态,动态的计算数据发送的速度,得到单次数据报发送的最大生存时间(MSL),超时时间即为(2MSL)

了解:如果一直接收不到ACK,超时时间会如何处理? Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时时间都是500ms的整数倍. 如果重发一次之后, 仍然得不到应答, 等待 2500ms 后再进行重传. 如果仍然得不到应答, 等待 4500ms 进行重传. 依次类推, 以指数形式递增(2的指数倍). 累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接.

(4)连接管理机制(安全机制)

建立连接--->TCP三次握手

TCP三次握手的流程

ACK:确认号是否有效
SYN:请求对方建立连接,我们把携带SYN表示的称为同步报文段
FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

1.主机A发送syn到主机B,要求建立a到b的连接。此时主机A的状态为syn_sent

2.主机B回复ack+syn(这里的ack和syn数据报本来是两个,但是仅标志位不同,所以可以合并,为什么不是四次的原因),要求建立b到a的连接,主机B的状态为syn_rcvd

3.主机A回复第2步syn的ack。主机A的状态为established,建立A到B的连接 主机B接收到第3步的数据报,建立B到A 的连接,主机B的状态置为established

TCP三次握手中的问题:

1,syn为什么有两个? 双方的连接状态会持续,且链接是有方向的。

2,第二步中,为什么是ack+syn? 本质上是一个发ack应答,一个发syn请求,而且是方向一致的两个数据报,可以合并

3,第三步中,ack确认应答哪个? 应答第二部中的syn

断开连接--->TCP四次挥手:

1.主机A发送fin到主机B,请求关闭a到b的连接

2.主机B回复ack,主机B的状态置为close_wait

3.主机B发送fin到主机A,请求关闭b到a的连接

4.值即A回复ack(第三步的fin),状态置为time_wait 主机B接收到第四步的数据报,状态置为closed 主机A经过2MSL(超时等待时间)之后,状态置为closed

 

TCP四次挥手中的问题:

1,第二步和第三步为什么不能和3次握手流程一样,进行合并。 原因:第二步是TCP协议在系统内核中实现的,自动响应的ack。第三步时应用程序手动调用close来关闭连接的。程序在关闭连接之前,可能需要执行释放资源等前置操作,所以不能合并(TCP协议实现时,没有这样的设计)

2,第三步中,主机A为什么不能直接设置为closed, 原因:第四个数据可能丢包,如果直接置为closed,丢包后无法重新发送数据。主机B达到超时时间之后,会重发第三个数据报,然后要求主机A再次回复ack。

3,服务器出现大量的close_wait状态,是为什么? 服务器没有正确的关闭连接(程序没有调用close,或者没有正确使用)

(5)滑动窗口(效率)

如果没有滑动窗口,网路数据传输就是串行的方式(发送一次之后,等待应答,这个时间内,主机A无事可做,主机B也一样),效率比较差。 使用滑动窗口可以解决效率的问题:类似于多线程的方式,并发的,同时发送多个数据报

1.窗口大小指的是无需等待确认应答而可以继续发送数据的最大值. 上图的窗口大小就是4000个字节(四个段).

2.发送前四个段的时候, 不需要等待任何ACK, 直接发送;

3.收到第一个ACK后, 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推;

4.操作系统内核为了维护这个滑动窗口, 需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答;只有确认应答过的数据, 才能从缓冲区删掉;

5.窗口越大, 则网络的吞吐率就越高;

丢包问题:

1.数据报丢包 如果主机A发送的数据报丢包,主机B的ack应答,会根据主机A已经收到的连续数据报的最大值+1返回ack应答,当主机A收到三个同样的ack应答之后,会将丢掉的数据报进行重发(具有接收缓冲区,来记录已经接收的数据报的序号)

2.ACK应答丢包:这种情况下, 部分ACK丢了并不要紧, 因为可以通过后续的ACK进行确认

如果是滑动窗口的第一个包丢了,根据上述数据报丢包的情况,收到了第6个报的ACK应答,是从6001开始,说明第一个报主机B已经收到,所以ack丢包可以根据后序ack确定数据报主机B是否收到

关于滑动窗口的几个问题:

<1>.滑动窗口的大小:无需等待确认应答而可以继续发送数据的最大值

<2>.如何确定窗口的大小:由拥塞窗口和流量控制窗口决定(滑动窗口大小=(拥塞窗口大小,流量控制大小)

<3>.如何滑动:依赖于ACK的确认序号(ack确认序号前的数据报都已经接收到了),在该ACK确认序号前,当次并行收到了多少个数据报,就可以滑动多少

<4.>为什么要有接收缓冲区和发送缓冲区: 发送端的发送缓冲区:记录已经发送的数据——搜到对应的ACK应答,才可以清理该数据 接收端的接收缓冲区:记录已经接收的数据——如果发送数据报丢包,才知道让对方重发

(6)流量控制机制(安全机制)

接受端处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,继而引起丢包重传等等一系列连锁反应。 接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端; 发送端接受到这个窗口之后, 就会减慢自己的发送速度; 如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端.

当接收端使用流量控制窗口时,如何保证接受端的数据安全? 告诉发送端,影响发送端滑动窗口的大小

(7)拥塞控制机制(安全机制)

少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 我们就认为网络拥塞; 发送端在网络状态不明的情况下,贸然发送大量的数据,会造成网络拥堵,需要先发送少量数据探路,设置拥塞窗口的大小

如何确定拥塞窗口的大小 此处引入一个概念程为拥塞窗口 发送开始的时候, 定义拥塞窗口大小为1; 每次收到一个ACK应答, 拥塞窗口加1; 每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口; 为了不增长的那么快, 因此不能使拥塞窗口单纯的加倍. 此处引入一个叫做慢启动的阈值 当拥塞窗口超过这个阈值的时候, 不再按照指数方式增长, 而是按照线性方式增长

(8)延迟应答机制(效率)

举个例子: 假设接收端缓冲区为1M. 一次收到了500K的数据; 如果立刻应答, 返回的窗口就是500K; 但实际上可能处理端处理的速度很快, 10ms之内就把500K数据从缓冲区消费掉了; 在这种情况下, 接收端处理还远没有达到自己的极限, 即使窗口再放大一些, 也能处理过来; 如果接收端稍微等一会再应答, 比如等待200ms再应答, 那么这个时候返回的窗口大小就是1M;

延迟应答类型: 数量限制: 每隔N个包就应答一次; 时间限制: 超过最大延迟时间就应答一次;

(9)捎带机制(效率)

在延迟应答的基础上, 我们发现, 很多情况下, 客户端服务器在应用层也是 “一发一收” 的,意味着当客户端给服务端发送请求时,服务端会给客户端响应数据,此时ACK就像可以搭请求数据的顺风车,一起发送。

接收端响应的ACK,和主动发送的数据,可以合并返回。

<3>TCP总结

(1)TCP特性

TCP是有连接的可靠协议 可靠性: (安全) 校验和 TCP报文 序列号(按序到达) 中的字段 机制:

确认应答
超时重发
连接管理
流量控制
拥塞控制

推高性能: (效率) 滑动窗口/快速重传 延迟应答 捎带应答

(2) 面向字节流

TCP既有发送缓冲区,也有接收缓冲区,数据没有大小限制

调用write时, 数据会先写入发送缓冲区中; 如果发送的字节数太长, 会被拆分成多个TCP的数据包发出; 如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区长度差不多了, 或者其他合适的时机发送出去; 接收数据的时候, 数据也是从网卡驱动程序到达内核的接收缓冲区; 然后应用程序可以调用read从接收缓冲区拿数据; 另一方面, TCP的一个连接, 既有发送缓冲区, 也有接收缓冲区, 那么对于这一个连接, 既可以读数据, 也可以写数据. 这个概念叫做 全双工

(3)粘包问题

在TCP的协议头中, 没有如同UDP一样的 “报文长度” 这样的字段, 但是有一个序号这样的字段 站在传输层角度看,报文是一个一个按照顺序排序好放在缓冲区,但是站在应用层角度看,都是一个个数字,不知道哪个数字是一段报文的开头,也不知道哪一个数字是结尾。这就是粘包 所以得明确一个报文的开头和结尾

但是对应UDP来说: 对于UDP, 如果还没有上层交付数据, UDP的报文长度仍然在. 同时, UDP是一个一个把数据交付给应用层.就有很明确的数据边界. 站在应用层的站在应用层的角度, 使用UDP的时候, 要么收到完整的UDP报文, 要么不收. 不会出现"半个"的情况

<4>UDP VS TCP

(1)UDP和TCP的特性

TCP用于可靠传输的情况, 应用于文件传输, 重要状态更新等场景; UDP用于对高速传输和实时性要求较高的通信领域, 例如, 早期的QQ, 视频传输等. 另外UDP可以用于广播

(2)如何使用UDP进行可靠传输

引入序列号,保证数据顺序。 引入确认应答,确保对端收到了数据。 引入超时重传,如果隔一段时间没有应答,就重新发数据。

4.MTU和IP协议

<1>MTU协议

MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制. 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU; 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片 不同的数据链路层标准的MTU是不同的;

<2>IP协议

1.协议头格式:

        4位版本|4位首部长度|8位服务类型 | 16位总长度(字节数)
             16位标识                 | 3位标识| 13位片偏移
        8位生存时间       | 8位协议    | 16位首部检验和
                      32位源IP地址
                      32位目的地址
                      选项(如果有)
                      
                         数据

简单了解: 4位版本号(version):指定IP协议的版本,对于IPV4来说,就是4

8位服务类型:3位优先权字段,4位TOS字段,和一位保留字段(必须置为0). 4位 TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要(应用层协议需要不同安全/效率需求,此时可以设置服务类型来满足)

5.HTTP和HTTPS

<1>HTTP

(1)HTTP前置知识

网络数据传输

网络数据传输,都需要使用相同的协议,双方约定好的统一规范(封装和解析的数据格式规范) 协议:数据格式的规定 目标:对于HTTP协议来说,就是学习里面的协议格式。结合理论实操,进行程序的调试,HTTP协议格式本身,http数据中,包括自己的数据格式

认识URL

protocol :// hostname[:port] / path / [;parameters][?query]#fragment

protocol(协议): 指定使用的传输协议,下面也列出了几种protocol属性的有效方案名称。那我们最常用的就是HTTP协议,它也是目前www中应用最广泛的协议。 file 资源是本地计算机上的文件。格式file:///,注意后边应是三个斜杠。 ftp 通过 FTP访问资源。格式 FTP:// gopher 通过 Gopher 协议访问该资源。 http 通过 HTTP 访问该资源。 格式 HTTP:// https 通过安全的 HTTPS 访问该资源。 格式 HTTPS:// mailto 资源为电子邮件地址,通过 SMTP 访问。 格式 mailto:

hostname(主机名) 是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。

port(端口号) 整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如http的默认端口为80。如果输入时省略,则使用默认端口号。有时候出于安全或其他考虑,可以在服务器上对端口进行重定义,即采用非标准端口号,此时,URL中就不能省略端口号这一项。

path(路径) 由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。 parameters(参数) 这是用于指定特殊参数的可选项。

parameters(参数) 这里用于指定特殊参数的可选项

query(查询) 可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP。NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。

fargmant(信息片段) 字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。

HTTP

(1)域名

域名:基于DNS解析为IP

IP:网络中定位主机的地址(逻辑地址)

PORT:端口号,定位某个主机中唯一的进程(应用程序)

url:url是全路径(绝对路径) uri:uri包含了url这种全路径,还包含相对路径 特殊注意事项:输入域名直接访问,其实是访问/这个资源的路径。 浏览器中,不输入端口号,是因为http协议的默认端口是80 url中的请求数据:请求路径?key1=value1&key2=value2… 问号前代表绝对路径,问号后代表请求的资源数据

http协议格式

Request HTTP的请求包括:请求行(request line)、请求头部(header)、空行 和 请求数据 四个部分组成。 Response 一般情况下,服务器收到客户端的请求后,就会有一个HTTP的响应消息,HTTP响应也由4部分组成,分别是:状态行、响应头、空行 和 响应体。

http请求方法

   方法             说明                               支持的HTTP协议版本
   GET              获取资源                             1.01.1
   POST             传输实体主体                          1.01.1
   PUT              传输文件                             1.01.1
   HEAD             获得报文首部                          1.01.1
   DELETE           删除文件                             1.01.1
   OPTIONS          询问支持的方法                        1.1
   TRACE            追踪路径                             1.1
   CONNECT          要求用隧道协连接代理                   1.1
   LINK             建立和资源之间的联系                   1.0
   UNINE            断开连接关系                          1.0

重点了解get和post方法

1.get的请求数据只能放在url中,post的数据,可以放在url和请求体

2.url长度有限制,所有get方法请求数据不能太多,并且url只能传输ascli字符

3.安全性强,post可以存放请求数据在请求体,相对更加安全

(4)http状态码

服务端返回(服务端设置),站在服务端的角色上,状态码都是对应的含义,站在客户端的角色上就不一定。

        1**
​
        信息,服务器收到请求,需要请求者继续执行操作
​
        2**
​
        成功,操作被成功接收并处理
​
        3**
​
        重定向,需要进一步的操作以完成请求
​
        4**
​
        客户端错误,请求包含语法错误或无法完成请求
​
        5**
​
        服务器错误,服务器在处理请求的过程中发生了错误

重点掌握:

200 OK 请求成功。一般用于GET与POST请求

301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替

302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI

304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源

400 Bad Request 客户端请求的语法错误,服务器无法理解

403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求

404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面

500 Internal Server Error 服务器内部错误,无法完成请求

502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应

HTTP头信息

Content-Type:数据类型(text/html等) 消息体的格式,告诉对方该使用什么方式解析

Content-Length:Body的长度 消息体的长度 Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口

User-Agent:声明用户的浏览器版本信息

referer:当前页面是从哪个页面跳转过来的

location:搭配3xx状态码使用,告诉用户接下来要去哪里访问

Cookie:用于在客户端存储少量信息,通常用于实现会话(session)的功能。

<2>HTTPS

HTTP是明文传输的,不安全 HTTPS是基于HTTP+SSL/TSL来实现的,发送的数据需要加密,接收到的数据需要解密,比HTTP安全,但是传输效率比HTTP低

前置知识:为什么需要HTTPS

HTTP是不安全的,在传输的过程中,当客户端发送数据时,可能被钓鱼网站“欺骗”,将钓鱼网站当作服务端,或者直接被钓鱼网站窃取到数据,然后更改,造成不安全的影响 此时需要解决: a:如何保证服务器是真实的,不是钓鱼网站? b:解决网络数据传输,使用明文,所有路途中的设备,如果获取到,存在信息泄露

所以,就要使用到证书来解决安全问题 a:权威的证书机构颁发的证书(安装浏览器时,初始化就内置权威证书)(解决上述a问题) b:https服务器证书(解决上述b问题)

私钥,公钥,密钥: 密钥:客户端,服务端用来加解密 对称加密:使用同一个钥匙,来加解密 公钥的生成(SSL握手阶段): 见SLL握手

https中涉及的细节: 1.使用公钥和私钥来生成密钥(这里是非对称加密生成密钥) 2.密钥加解密真正的数据(这里进行的对称加密,效率比非对称加密高)

如何获取并验证服务器证书: 具体流程:

1.用密钥进行加解密:

<1>.客户端向服务端索要并验证公钥

<2>.双放协商生成"对话密钥"

<3>.双方采用“对话密钥”进行加解密通信

2.HTTPS握手阶段(根据公钥私钥生成对话密钥)(以上1,2步需要保证对话密钥不被钓鱼)

<1>.首先客户端给出协议版本号,一个客户端生成的随机数,以及支持的加密方式

<2>.服务端确认双方使用的加密方式,给出数字证书,以及一个服务器生成的随机数

<3>.客户端确认数字证书有效,然后生成一个新的随机数,并使用数字证书中的公钥,加密这个随机数,发个服务端

<4>.服务端使用自己的私钥,获取客户端发来的随机数

<5>.客户端和服务端根据约定的加密方式,使用前面的三个随机数,生成密钥

3.发送数据的阶段: 客户端使用对话密钥加解密真正的数据 服务端使用对话密钥加解密真正的数据 注意:此部分被钓鱼也没有关系(对话密钥无法解密)

正向代理和反向代理

<1>正向代理服务器

(1)概念

正向代理服务器:抓包工具 正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。

(2)使用场景

1.特点:要访问的服务器只知道代理服务器来访问它,并不知道真实的客户端是谁 2.使用场景:正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。

<2>反向代理服务器

(1)概念

反向代理服务器:nginx等 反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了

(2)使用场景和特点

1.特点:特点:反向代理服务器隐藏了真实服务器的信息,例如淘宝,京东,天猫等 2.使用场景: 反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。

网络面试题

<1>说一说TCP/IP模型,以及都做了哪些事情

TCP/IP模型分为五层,分别是应用层,传输层,网络层,数据链路层,物理层 TCP/IP协议主要是报文的拆分,增加协议头,数据的传输,路由和寻址以及数据的重组

<2>说一说TCP的三次握手四次挥手

1,建立连接--->TCP三次握手 TCP--->三次握手流程:

1,主机A发送syn到主机B,要求建立A到B的连接。此时主机A的状态为syn_sent

2,主机B回复ack+syn(这里的ack和syn数据本来是两个,但是仅标志位不同,所以可以合并,为什么不是四次的原因),要求建立B到A的连接,主机B的状态为syn_rcvd

3,主机A回复第二步的syn的ack。主机A的状态为established(既定),建立A到B的连接,主机B接受到第三步的数据报,建立B到A的连接,主机B的状态置为established

TCP------>三次握手中的问题:

1.syn为什么有两个? 双方的连接状态会持续,且连接是有方向的

2.第二步中,为什么是ack+syn? 本质上是一个发ack应答,一个发syn请求,而且是方向一致的两个数据报,可以合并

3.第三步中,ack确认应答哪个? 应答第二步的syn

断开连接--->TCP四次挥手 TCP------>四次挥手的流程

1.主机A发送fin到主机B,请求关闭a到b的连接 2.主机B回复ack,主机B的状态置为close_wait 3.主机B发送fin到主机A,请求关闭b到a的连接 4.值即A回复ack(第三步的fin),状态置为time_wait 主机B接收到第四步的数据报,状态置为closed 主机A经过2MSL(超时等待时间)之后,状态置为closed

TCP------>4次挥手中的问题 1.第2步和第3步为什么不能和3次握手流程一样,进行合并 原因:第2步是TCP协议在系统内核中实现时,自动响应的ack 第3步时应用程序手动调用close来关闭连接的 程序在关闭连接之前,可能需要执行释放资源等前置操作,所以不能合并(TCP协议实现时,没有这样进行设计)

2.第3步中,主机A为什么不能直接设置为closed状态 原因: 第4个数据报可能丢包,如果直接置为closed,丢包后无法重新发送数据。 主机B达到超时时间之后,会重发第三个数据报,然后要求主机A再次回复ack

3.服务器出现大量的close_wait状态,是为什么? 服务端没有正确的关闭连接(程序没有调用close,或者没有正确使用)

<3>IPV4和IPV6的区别

1.地址不同(IPV4 32位,IPV6 128位),所有地址的空间,数目不同

2.地址分配不同(IPV4资源不够,分配的话需要竞争,而IPV6可以给每个人都分配很多的地址)

3.寻址的方式不同:IPV4 通过子网掩码计算网络地址,而IPV6有固定的计算方式划分网络

<4>TCP和UDP的区别

1.TCP是有连接的可靠传输协议,而UDP是无连接的

2.UDP传时数据是有大小限制的,而TCP没有

3.UDP是面向数据报的,而TCP是面向数据流的。

4.TCP保证数据正确性,顺序性,而UDP不能保证.

5.UDP的传输速率高于TCP

<5>如何用UDP进行可靠传输

引入序列号, 保证数据顺序; 引入确认应答, 确保对端收到了数据; 引入超时重传, 如果隔一段时间没有应答, 就重发数据;

<6>正向代理和反向代理的区别

正向代理:要访问的服务器只知道代理服务器来访问它,并不知道真实的客户端是谁

反向代理:反向代理正好相反。对于客户端来说,反向代理就好像目标服务器,客户端向反向代理发送请求,接着反向代理判断请求走向何处,隐藏了真实的服务器。

<7>说说HTTP和HTTPS

HTTP是超文本传输协议,是目前应用最广泛的网络通信协议,也是客户端和服务端交互的一系列行为的标准 http header包含三大部分,有General。Response Headers(响应头)。 Request Headers(请求头)。 http是无连接,无状态的(每次连接只处理一个请求,发送完数据后,不会记录) 而https简单讲是HTTP的安全版,即HTTP下加入SSL层,主要是来确认网站的真实性和数据传输的安全。

区别:

1.http的数据是明文传输,而https是加密传输,需要用到ca证书

2.http使用80端口,而https是443端口

3.http的速度比https要快

<8>https中SSL握手的过程

<1>.首先客户端给出协议版本号,一个客户端生成的随机数,以及支持的加密方式

<2>.服务端确认双方使用的加密方式,给出数字证书,以及一个服务器生成的随机数

<3>.客户端确认数字证书有效,然后生成一个新的随机数,并使用数字证书中的公钥,加密这个随机数,发个服务端

<4>.服务端使用自己的私钥,获取客户端发来的随机数

<5>.客户端和服务端根据约定的加密方式,使用前面的三个随机数,生成密钥

<9>DNS解析(DNS找IP)

1.当浏览器中输入www.bai.com域名时,操作系统会检查自己本地的hosts文件查看是否有这个网址的映射关系,如果有,直接调用

2.如果没有,则查找本地的DNS解析器缓存,如果有,则直接返回IP

3.如果没有,再找TCP/IP参数中设置的本地的DNS服务器,如果该域名包含再本地配置区域的资源中,则返回解析结果。

4.也可能查找的域名,本地的DNS服务器已经缓存在网址的映射关系,那么直接调用这个IP

5.如果本地DNS服务器也无法解析,会根据本地的DNS服务器是否设置转发器进行查询

如果是未转发模式,本地DNS会把请求发给13台根DNS,由对应的根服务器(例如.com)向下找,最后完成解析

如果是转发模式,那么DNS服务器会把请求一级一级向上传,往上找,直到传到根DNS。

<10>GET和POST的区别

1.get的请求数据只能放在url中,post的数据,可以放在url和请求体

2.url长度有限制,所有get方法请求数据不能太多,并且url只能传输ascli字符

3.安全性将,post可以存放请求数据在请求体,相对更加安全

4.GET主要是从服务端获取数据,而POST请求主要是将数据发送到服务端

5.POST请求刷新会被重新提交,但Get请求不会

<11>常见的状态码

400:客户端请求语法错误,服务端无法理解

405:映射找到了,但是客户端请求方法和服务端提供的请求方法不匹配

500:服务端内部报错

403:无权限

<12>输入一个URL到浏览器中,会发生什么

1.域名解析(DNS解析)

2.发起TCP的三次握手

3.建立TCP连接后发起HTTP请求(如果浏览器存储了该域名下的Cookies,那么会把Cookies放入HTTP请求头里发给服务器。)

4.服务器端响应http请求,浏览器得到html代码

5.浏览器解析html代码,并请求html代码中的资源

6.浏览器对页面进行渲染呈现给用户

posted @ 2023-08-30 14:46  LoYoHo00  阅读(27)  评论(0编辑  收藏  举报
levels of contents