大家好!我是未来村村长,就是那个“请你跟我这样做,我就跟你这样做!”的村长!
未来村村长正推出一系列【To Interview】文章,该系列文章重要是对Java开发面试内容的梳理,只关注面试重点。虽然CSDN上有很多关注面试的文章,但其整篇文章全部由面试题拼接而成,没有对知识进行很好的串联。
”天下苦八股文久矣?吾甚哀,若学而作苦,此门无缘,望去之。“
大多数文章都是从物理层向上讲到应用层不利于快速学习和理解,本篇文章从顶层应用层开始向下讲到网络层,利于快速掌握计网的重点知识。
组成部分:硬件、软件、协议
工作方式:边缘部分和核心部分
按照分布范围可分为四类:
OSI体系结构,意为开放式系统互联。国际标准组织制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。每一层负责一项具体的工作,然后把数据传送到下一层。【法律标准】
将OSI结构的物理层和数据链路层合并成为网络接口层,去掉了会话层和表示层。在TCP/IP协议中的网络接口层并没有规定什么具体的内容,目的是为了允许任何形式的网络接口使用TCP/IP协议。
实际上TCP/IP协议只有三层:网际层、运输层、应用层。【事实标准】
结构相当于把TCP/IP协议中的网络接口层还原成数据链路层、物理层,网际层还原成网络层。一共分为应用层、运输层、网络层、数据链路层、物理层。
应用层解决通过应用进层的交互来实现特定网络应用的问题。
服务器是总是打开的主机,服务于许多来自其他客户机的主机请求。工作流程如下:
P2P是各主机权力和义务平等,每个节点都有下载和上传功能,没有固定的客户和服务器划分。P2P模式虽然能减轻服务器的计算压力,但是容易造成网络拥堵,ISP(互联网服务提供商)不喜欢这样。
因特网使用的命名系统,用来把便于记忆的含有特定意义的主机名转换为便于及其处理的IP地址。
例:www.baidu.com的ip地址为182.61.200.6
域名到IP地址的解析是由运行在域名服务器上的程序完成的。因特网的域名系统是一个联机分布式的数据库系统,采用客户/服务器模型,一个服务器所管辖的范围是有限的,DNS采用了大量的域名服务器,以层次方式组织。主要由以下四类:
域名解析,把域名映射成为IP地址,或把IP地址映射成域名的过程,前者正向解析,后者反向解析。
主机向本地域名服务器查询采用递归查询,本地域名服务器向根域名服务器查询采用迭代查询。
域名解析过程如下:
文件传输协议(File Transfer Protocol)是因特网上使用最广泛的文件传输协议,FTP提供交互式访问。
FTP采用客户/服务器的工作方式,使用TCP可靠传输服务,一个FTP服务器进程可同时为多个客户提供服务,由两大部分组成:一个主进程负责接收新的请求,若干从属进程负责处理单个请求。
FTP服务器必须在整个会话期间保留用户的状态信息,其工作时使用两个并行的TCP连接,一个是控制连接(端口21),一个是数据连接(端口20)。控制连接在整个会话期间一直保持打开,用于传送FTP相关的控制命令,数据连接用于文件传输,每次文件传输时才建立,传输结束后就关闭。
FTP工作原理如下:
电子邮件(E-mail)是因特网上最早流行的一种应用,并且仍是当今因特网上最重要、最实用的应用之一。其使用了 SMTP(简单邮件传输协议)或POP3(邮局协议)。
用户浏览器与邮件服务器之间的数据传输使用的是HTTP,邮件服务器之间传送邮件使用SMTP。
万维网(World Wide Web)是一个资料空间,其使用链接的方式让用户能方便地从网上的一个站点访问另一个站点。万维网指的就是网络上无数的站点和网页集合。其内核由三个标准组成:
万维网以客户/服务器方式工作:
HTTP(超文本传输协议),定义了浏览器怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。HTTP报文的每个字段都是ASCII码,以共有两类报文,一是客户向服务器发送的请求报文,二是服务器返回客户端的响应报文。
请求报文:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
响应报文
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
⭐️GET和POST区别:
get:请求参数是作为一个key/value对的序列(查询字符串)附加到URL上的。
post:请求参数是在http标题的一个不同部分(名为entity body)传输的,这一部分用来传输表单信息,因此必须将Content-type设置为:application/x-www-form-urlencoded。
GET:产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
POST:POST产生两个TCP数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200(返回数据)。
都在第三次握手时进行第一次数据发送,GET发送一次,而Post在服务器响应100 Continue后再发送data
post更安全,不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中。post发送的数据更大,能发送更多的数据类型。post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交)
缺陷:对带宽的利用率不理想。(带宽:每秒最大能发送或者接收的字节数)
原因:
HTTP/2采用二进制格式而非文本格式
HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个连接即可实现并行
使用报头压缩,HTTP/2降低了开销
HTTP/2让服务器可以将响应主动“推送”到客户端缓存中
HTTPS和HTTP的主要区别:
SSL/TLS协议的基本过程(TLS1.2):
缺点:HTTPS协议握手阶段比较费时,连接缓存不如HTTP高效,会增加数据开销和功耗。SSL证书需要钱,功能越强大的证书费用越高,加密范围也比较有限。
浏览器每次发起请求,都会先在浏览器缓存中查找该请求的结果以及缓存标识,每次拿到返回的请求结果都会将该结果和缓存标识存入浏览器缓存中。
浏览器第一次向服务器发起该请求后拿到请求结果,会根据响应报文中HTTP头的缓存标识,决定是否缓存结果,是则将请求结果和缓存标识存入浏览器缓存中
缓存以共有三种类型:
缓存存放:浏览器会在js和图片等文件解析执行后直接存入内存缓存中,那么当刷新页面时只需直接从内存缓存中读取(from memory cache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(from disk cache)。
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中。
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
传输层为应用层提供通信服务,属于面向通信的最高层,面向用户功能的最底层。传输层位于网络层之上,他为运行在不同主机的进程之间提供了逻辑通信,而网络层为主机提供逻辑通信。
传输层的功能如下:
端口的作用:端口是应用程序数据传输的接口。让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将报文段中的数据向上通过端口交付给应用层相应的进程。
端口号:标识应用程序,长度为16bit,只具有本地意义。即端口号只标识本计算机应用层的各进程。端口号分为两类,服务端端口号和客户端端口号。
服务端端口号:分为熟知端口号和登记端口号。熟知端口号指派给TCP/IP最重要的一些应用程序,登记端口号必须在IANA登记防止重复使用。
客户端端口号:数值为49152~65535,只在用户进程运行才存在。
IP地址用于标识区别不同的主机,端口号用来标识区别同一台主机中的不同应用进程。网络采用发送方和接收方的套接字组合来识别端点,即套接字是通信端点:
套接字 =(主机IP地址,端口号)
套接字唯一标识了网络中一台主机上的一个应用进程。
TCP/IP协议族在IP层之上使用了两个传输协议:一是面向连接的传输控制协议TCP,采用TCP时传输层向上提供的是一条双全工的可靠逻辑信道。二是无连接的用户数据报协议UDP,传输层向上提供的是一条不可靠的逻辑信道。
TCP与UDP区别:
① TCP
TCP提供面向连接的服务,在传送数据前必须建立连接,数据传送结束后要释放连接。TCP不提供广播或组播服务。由于TCP提供面向连接的可靠传输服务,需要较多的开销,如确认、流量控制、计时器、连接管理等,使得协议数据单元的头部增大,且占用较多的处理机资源。
② UDP
UDP是一个无连接非可靠的传输层协议,其在IP之上只提供两个附加服务:多路复用和对数据的错误检查。UDP在传送数据之前不需要先建立连接,远程主机的传输层收到UDP报文后,不需要给出确认。
当传输层从IP层收到UDP数据包时,就会根据首部中的目的端口,把UDP数据报通过相应的端口交给应用进程。如果接收方UDP发现目的端口号不正确,就会丢弃该报文,并返回“端口不可达”差错报文给发送方。
(只说明必要部分)
第一步【客户机→服务器】:客户机的TCP首先向服务器的TCP发送一个请求报文段,报文段不含应用层数据。该报文端的起始序号seq=x,同步位SYN=1表示该报文是连接请求。(seq=x,SYN=1,不含数据)
第二步【服务器→客户机】:服务器的TCP收到连接请求报文后,若同意连接,则向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN=1表示连接接收,ACK=1表示确认号字段生效,ack=x+1说明服务器收到序号为x的字段了,下次希望接收x+1的字段,seq=y表示该报文端的起始序号为seq。(SYN=1,ACK=1,seq=y,ack=y+1,不含数据)
第三步【客户机→服务器】:当客户机收到确认字段后,还要向服务器给出确认,并且给该TCP连接分配缓存和变量。报文段的ACK=1表示确认号字段生效,seq=x+1表示序号字段为x+1(正如服务器希望的那样),ack=y+1表示确认号字段为y+1说明客户机希望服务器下次发来的报文段的第一个数据字节为序号=y+1的字节。(ACK=1,seq=x+1,ack=y+1,可含数据)
为什么不是两次:
如果只是两次,服务器不知道客户机是否能接收数据。当客户机断开连接后,服务器并不知道客户机已经不需要进行数据传输了,但是已经为该TCP连接分配了TCP缓存和变量,增加了无谓的开销。或者客户机第一次请求的报文因为网络原因滞留了,客户机又发送了一条,可能造成服务器又再次为其建立TCP连接。所以需要三次握手才能确认双方的接收与发送能力是否正常。
第一步【客户机→服务器】:客户机向TCP连接发送连接释放报文段,并停止发送数据,主动关闭TCP连接,报文段中的FIN=1表示请求释放连接,seq=u(u=上一个传送序号字段+1),因为TCP是双全工的,所以该步骤只是客户机不能发送数据,而服务器可以发送数据。(FIN=1,seq=u)[客户端进入FIN-WAIT-1(终止等待1)状态]
第二步【服务器→客户机】:服务器收到报文端发出确认,确认号为ack=u+1,序号是seq=v,(u=上一个传送序号字段+1),ACK=1表示确认号字段有效。(ACK=1,seq=v,ack=u+1)[服务端就进入了CLOSE-WAIT(关闭等待)状态] [客户端就进入FIN-WAIT-2(终止等待2)状态]
第三步【服务器→客户机】:若服务器没有数据要发送,就通知TCP释放连接。(FIN=1,ACK=1,seq=w,ack=u+1)[服务器就进入了LAST-ACK(最后确认)状态]
第四步【客户机→服务器】:客户机收到释放报文端后,必须发出确认。(ACK=1,seq=u+1,ack=w+1)[客户端就进入了TIME-WAIT(时间等待)状态]
time_wait状态是第几次挥手之后:
第四次挥手
time_wait持续多久?为什么?:
2 MLS,因为第四次挥手时TCP连接还没有释放,必须经过2 MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。总是假定网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
为什么是四次:
关闭连接时,客户端向服务端发送 FIN
时,仅仅表示客户端不再发送数据了但是还能接收数据。
服务器收到客户端的 FIN
报文时,先回一个 ACK
应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN
报文给客户端来表示同意现在关闭连接。
当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
拥塞控制是指防止过多的数据注入网络,保证网络中的路由器和链路不至于过载。流量控制是消除发送方使接收方缓存区溢出的可能性,因此流量控制是速度匹配服务。
拥塞控制和流量控制的区别:拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、路由器等。而流量控制往往指点对点的通信量控制,即接收端控制发送端,流量控制所做的就是抑制发送端发送数据的速率,以便接收端来得及接收。
因特网定义了4个算法进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
拥塞控制就是TCP协议要求发送方维护以下两个窗口:
发送窗口的上限应该取接收窗口和拥塞窗口较小的一个。
网络层的主要任务是实现网络互连,进而实现数据包在网络之间的传输。我们只关注一些定义性的概念即可。
TCP/IP: TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,同时是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。 TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。
IP(IPv4、IPv6):相当于 OSI 参考模型中的第3层——网络层。网络层的主要作用是“实现终端节点之间的通信”。这种终端节点之间的通信也叫“点对点通信”。大致分为三大作用模块,它们是 IP 寻址、路由(最终节点为止的转发)以及 IP 分包与组包。
IP 地址分为四个级别,分别为A类、B类、C类、D类。它根据 IP 地址中从第 1 位到第 4 位的比特列对其网络标识和主机标识进行区分。
IPv6(IP version 6)是为了根本解决 IPv4 地址耗尽的问题而被标准化的网际协议。IPv4 的地址长度为 4 个 8 位字节,即 32 比特。而 IPv6 的地址长度则是原来的 4 倍,即 128 比特,一般写成 8 个 16 位字节。
IP 分包与组包
TCP/IP协议实际上只有三层:网际层、运输层、应用层。
我们不关注网络接口层(数据链路层、物理层),所以该部分内容此处不作整理。
点个关注,在未来村不会迷路
参考:
《王道考研——2021年计算机网络考研复习指导》
图源:
部分源于网络,侵删