面试官都震惊,你这网络基础可以啊!_tos字段-程序员宅基地

技术标签: Java从入门到精通  网络  

目录


打个小广告:最近和朋友搞个副业,做计算机编程相关服务(包括作业,课程设计,毕业设计,就业相关,考研相关,学习遇到的问题),各种语言技术栈都可以。如果有需要的加qq群877635095

网络

1.对网络的基础认识

<1>.组网方式

1.网络互联:使用集线器将少量主机连在一起

在这里插入图片描述

  1. 局域网(LAN):使用交换机和路由器将主机连接,可以自由组合三种方式

    组网方式:

    <1>.交换机

    <2>.路由器

    <3>.交换机+路由器

在这里插入图片描述

3.广域网(WAN):广域网和局域网知识相对的概念

例如:一个学校之间的网络就可以成为局域网,而一个国家,多个国家之间可以称为广域网,覆盖的区域不同在这里插入图片描述

组网方式:公网上,网络结点组成,每一个结点可以是:

在这里插入图片描述

<2>.OSI七层模型

1.对协议的简单理解:本质上是数据格式的定义。而知名的数据格式,大家普遍遵循的规定,就属于协议

2.OSI七层模型:一种网络分层的设计方法论,比较复杂且不实用,落地几乎都是TCP/IP四层,五层模型

在这里插入图片描述

<3>.TCP/IP五层(四层模型)

五层模型:除去OSI的表示层和会话层

四层模型:除去OSI的表示层,会话层和物理层

在这里插入图片描述

注意:

应用程序实现对应用层的封装分用

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

<4>.对封装分用的理解

1.封装:发送数据时,从高到低的顺序,按照对应的网络分层协议对数据进行包装
在这里插入图片描述

例如:

在这里插入图片描述

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

在这里插入图片描述

例如:

在这里插入图片描述

2.网络数据传输

<1>局域网

(1)认识IP和MAC

IP:

IP的格式:xxx.xxx.xxx.xxx
IP由四个部分组成,每个部分都是0-255.
网络号:前三个部分组成(用来标识网段),前三个部分相同,标识在一个网段
主机号:最后一个部分用来标识主机号
IP分为A-E五大类,部分范围是局域网IP,部分是广域网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.数据报发送给网关设备
在这里插入图片描述

目的MC:通过路由器网关的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发送http://www.baidu.com网络流程

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

2. 找到IP,数据报IP部分,PORT部分都有了:

在这里插入图片描述

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

  2. 如果是同一个网段,和局域网传输一样
    如果不是同一个网段:发送数据到网关
    找网关的MAC:
    在这里插入图片描述

  3. 找到网关的MAC之后,将http数据重新封装,交由交换机转发
    交换机转发:在MAC地址转换表(MAC映射端口),通过目的MAC找端口(交换机的屁股口)
    注意:这个过程没有封装和分用

注意:前五个步骤,和路由器组成的局域网传输流程一样 参考:局域网传输

  1. 路由器接收,分用数据报

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

在这里插入图片描述

7. 上述步骤之后,数据报由局域网到广域网进行传输
路途中的设备:

在这里插入图片描述

8. 数据报到达百度服务器之后
在这里插入图片描述

**9.**数据由百度服务器返回,路途上经过的设备传输流程和步骤七相同(但是不一定是原路返回)
**10.**路由器1接收响应数据(对接收的数据进行分用,修改,封装)

在这里插入图片描述

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

3.UDP和TCP

<1>UDP协议

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协议端格式:

在这里插入图片描述

六位标志位:
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)连接管理机制(安全机制)

流程图:

在这里插入图片描述

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回复第2步syn的ack。主机A的状态为established,建立A到B的连接
主机B接收到第3步的数据报,建立B到A 的连接,主机B的状态置为established

TCP------>三次握手中的问题:
1.syn为什么有两个?
双方的连接状态会持续,且连接是有方向的

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

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

2.断开连接------>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,或者没有正确使用)

(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)流量控制机制(安全机制)

接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就
会造成丢包, 继而引起丢包重传等等一系列连锁反应.

接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段, 通过ACK端通知发送端;
窗口大小字段越大, 说明网络的吞吐量越高;
接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端;
发送端接受到这个窗口之后, 就会减慢自己的发送速度;
如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据
段, 使接收端把窗口大小告诉发送端.

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

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

少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 我们就认为网络拥塞;

发送端在网络状态不明的情况下,贸然发送大量的数据,会造成网络拥堵,需要先发送少量数据探路,设置拥塞窗口的大小
在这里插入图片描述

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

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

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

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

(9)捎带机制(效率)

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

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

<3>TCP的总结

(1)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位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.

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

下面三个字段都与数据链路层MTU相关:
在这里插入图片描述

5.HTTP和HTTPS

<1>HTTP

(1)Http的前置知识
1)网络数据传输

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

在这里插入图片描述

2)认识URL

在这里插入图片描述

(2)HTTP
1)域名

域名:基于DNS解析为IP
IP:网络中定位主机的地址(逻辑地址)
PORT:端口号,定位某个主机中唯一的进程(应用程序)
url:url是全路径(绝对路径)
uri:uri包含了url这种全路径,还包含相对路径
特殊注意事项:输入域名直接访问,其实是访问/这个资源的路径。
浏览器中,不输入端口号,是因为http协议的默认端口是80
url中的请求数据:请求路径?key1=value1&key2=value2…
问号前代表绝对路径,问号后代表请求的资源,数据

2)http协议格式

在这里插入图片描述

3)http请求方法

在这里插入图片描述

重点了解get和post方法

get和post方法的区别:

在这里插入图片描述

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

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

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

其他区别:了解即可

4)http状态码

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

在这里插入图片描述

注:x表示0到9的数字
重点掌握:

在这里插入图片描述

5)http头信息

在这里插入图片描述

<2>HTTPS

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

<1>.前置知识:为什么需要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.发送数据的阶段:
客户端使用对话密钥加解密真正的数据
服务端使用对话密钥加解密真正的数据
注意:此部分被钓鱼也没有关系(对话密钥无法解密)

6.正向代理和反向代理

<1>.正向代理服务器

<1>概念

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

<2>原理图

在这里插入图片描述

<3>使用场景和特点

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

<2>.反向代理服务器

<1>概念

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

<2>原理图

在这里插入图片描述

<3>使用场景和特点

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

7.网络面试题

<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回复第2步syn的ack。主机A的状态为established,建立A到B的连接
主机B接收到第3步的数据报,建立B到A 的连接,主机B的状态置为established

TCP------>三次握手中的问题:
1.syn为什么有两个?
双方的连接状态会持续,且连接是有方向的

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

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

2.断开连接------>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.浏览器对页面进行渲染呈现给用户

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45704528/article/details/118635841

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue