首页|傲世皇朝注册|平台
首页|傲世皇朝注册|平台
全站搜索
 
 
新闻详情
 
当前位置
首页“中华会娱乐”主页
作者:管理员    发布于:2024-02-04 21:38    文字:【】【】【
       

  首页“中华会娱乐”主页TCP/TP四层模型:因为OSI七层模型模型结构复杂,不符合市场需求,因此引入

  TCP/IP五层模型:综合OSI和TCP/TP四层模型优点,实际应用还是四层模型

  应用层:其作⽤是通过应⽤程序间的交互来完成特定的⽹络应⽤。在应⽤层交互的数据单元我们称之为报⽂。

  FTP(File Transfer Protocol,⽂件传输协议)是⽤于在⽹络上进⾏⽂件传输的⼀套标准协议,使⽤客户/服务器模式,使⽤ TCP 数据报,提供交互式访问,双向传输。

  TFTP(Trivial File Transfer Protocol,简单⽂件传输协议)⼀个⼩且易实现的⽂件传输协议,也使⽤客户/服务器⽅式,使⽤UDP 数据报,只⽀持⽂件传输⽽不⽀持交互,没有列⽬录,不能对⽤户进⾏身份鉴定。

  SMTP(Simple Main Transfer Protocol,简单邮件传输协议)是在Internet 传输 Email 的标准,是⼀个相对简单的基于⽂本的协议。在其之上指定了⼀条消息的⼀个或多个接收者(在⼤多数情况下被确认是存在的),然后消息⽂本会被传输。可以很简单地通过 Telnet 程序来测试⼀个 SMTP 服务器。SMTP 使⽤ TCP 端⼝ 25。

  DHCP ( Dynamic Host Configuration Protocol,动态主机设置协议 ) 是⼀个局域⽹的⽹络协议,使⽤UDP 协议⼯作,主要有两个⽤途:⽤于内部⽹络或⽹络服务供应商⾃动分配 IP地址给⽤户⽤于内部⽹络管理员作为对所有电脑作中央管理的⼿段

  ② TCP/IP 参考模型没有对⽹络接⼝层进⾏细分,只是⼀些概念性的描述; OSI 参考模型对服务和协议做了明确的区分。

  ③ OSI 先有模型,后有协议规范,适合于描述各种⽹络;TCP/IP 是先有协议集然后建⽴模型,不适⽤于⾮ TCP/IP⽹络。

  ④ TCP/IP ⼀开始就提出⾯向连接和⽆连接服务,⽽ OSI⼀开始只强调⾯向连接服务,直到很晚才开始制定⽆连接的服务标准。

  ⑤ OSI 参考模型虽然被看好,但将⽹络划分为七层,实现起来较困难;相反,TCP/IP 参考模型虽然有许多不尽⼈意的地⽅,但作为⼀种简化的分层结构还是⽐较成功的。

  在最简单的情况下,传输层收取到报⽂并附上附加信息,该⾸部将被接收端的传输层使⽤。

  应⽤层报⽂和传输层⾸部信息⼀道构成了传输层报⽂段。附加的信息可能包括:允许接收端传输层向上向适当的应⽤程序交付报⽂的信息以及差错检测位信息。该信息让接收端能够判断报⽂中的⽐特是否在途中已被改变。运输层则向⽹络层传递该报⽂段。

  ⽹络层:增加了如源和⽬的端系统地址等⽹络层⾸部信息,⽣成了⽹络层数据报。该数据报接下来被传递给链路层。

  数据链路层:数据包添加发送端MAC 地址和接收端 MAC 地址后被封装成数据帧。

  在早期的 HTTP/1.0 中,浏览器每次 发起 HTTP 请求都要与服务器创建⼀个新的 TCP 连接,服务器完成请求处理后⽴即断开 TCP 连接,然⽽创建和关闭连接的过程需要消耗资源和时间,为了减少资源消耗,缩短响应时间,就需要重⽤连接。在 HTTP/1.1 版本中默认使⽤持久连接,在此之前的HTTP 版本的默认连接都是使⽤⾮持久连接,如果想要在旧版本的 HTTP 协议上维持持久连接,则需要指定connection 的⾸部字段的值为 Keep-Alive 来告诉对⽅这个请求响应完成后不要关闭,下⼀次咱们还⽤这个请求继续交流,我们⽤⼀个示意图来更加⽣动的表示两者的区别:

  对于⾮ Keep=Alive 来说,必须为每⼀个请求的对象建⽴和维护⼀个全新的连接。对于每⼀个这样的连接,客户机和服务器都要分配 TCP 的缓冲区和变量,这给服务器带来的严重的负担,因为⼀台 Web 服务器可能同时服务于数以百计的客户机请求。在 Keep-Alive ⽅式下,服务器在响应后保持该 TCP 连接打开,在同⼀个客户机与服务器之间的后续请求和响应报⽂可通过相同的连接进⾏传送。甚⾄位于同⼀台服务器的多个 Web ⻚⾯在从该服务器发送给同⼀个客户机时,可以在单个持久 TCP 连接上进⾏。

  然⽽,Keep-Alive 并不是没有缺点的,当⻓时间的保持TCP 连接时容易导致系统资源被⽆效占⽤,若对 KeepAlive 模式配置不当,将有可能⽐⾮ Keep-Alive 模式带来的损失更⼤。因此,我们需要正确地设置 keepalivet_imeout 参数,当 TCP 连接在传送完最后⼀个 HTTP 响应,该连接会保持 keepalive_timeout 秒,之后就开始关闭这个链接。

  ⻓连接:多⽤于操作频繁,点对点的通讯,⽽且客户端连接数⽬较少的情况。例如即时通讯、⽹络游戏等。

  短连接:⽤户数⽬较多的Web⽹站的 HTTP 服务⼀般⽤短连接。例如京东,淘宝这样的⼤型⽹站⼀般客户端数量达到千万级甚⾄上亿,若采⽤⻓连接势必会使得服务端⼤量的资源被⽆效占⽤,所以⼀般使⽤的是短连接。

  1. get 提交的数据会放在 URL 之后,并且请求参数会被完整的保留在浏览器的记录⾥,由于参数直接暴露在URL 中,可能会存在安全问题,因此往往⽤于获取资源信息。⽽post 参数放在请求主体中,并且参数不会被保留,相⽐ get ⽅法,post ⽅法更安全,主要⽤于修改服务器上的资源。

  4. get 提交的数据⼤⼩有限制(这⾥所说的限制是针对浏览器⽽⾔的),⽽post ⽅法提交的数据没限制

  6. get ⽅法产⽣⼀个TCP 数据包,post ⽅法产⽣两个(并不是所有的浏览器中都产⽣两个)。

  HTTP 中的 GET ⽅法是通过 URL 传递数据的,⽽ URL 本身并没有对数据的⻓度进⾏限制,真正限制GET ⻓度的是浏览器。(是的,平时在浏览器中输出数据并不是无限的)

  1. HTTP 协议以明⽂⽅式发送内容,数据都是未加密的,安全性较差。HTTPS 数据传输过程是加密的,安全性较好。

  ① 首先是客户机发起⼀个与服务器的TCP 连接,连接建立以后,浏览器和服务器进程就可以通过套接字接⼝访问 TCP。

  ②客户机从套接字接⼝发送 HTTP 请求报⽂和接收 HTTP 响应报⽂。

  ③ 服务器也是从套接字接⼝接收 HTTP 请求报⽂和发送 HTTP 响应报⽂。

  其中通信内容以明⽂的⽅式发送,不通过任何⽅式的数据加密。当通信结束时,客户端与服务器关闭连接。

  ① 客户端发起⼀个 HTTPS 请求,并连接到服务器的 443端⼝,发送的信息主要包括⾃身所⽀持的算法列表和密钥⻓度等;

  ② 服务端将⾃身所⽀持的所有加密算法与客户端的算法列表进⾏对⽐并选择⼀种⽀持的加密算法,然后将它和其它密钥组件⼀同发送给客户端。

  ③ 服务器向客户端发送⼀个包含数字证书的报⽂,该数字证书中包含证书的颁发机构、过期时间、服务端的公钥等信息。

  ④ 最后服务端发送⼀个完成报⽂通知客户端 SSL 的第⼀阶段已经协商完成。

  ⑤ SSL 第⼀次协商完成后,客户端发送⼀个回应报⽂,报⽂中包含⼀个客户端⽣成的随机密码串,称为pre_master_secre,并且该报⽂是经过证书中的公钥加密过的。

  ⑥ 紧接着客户端会发送⼀个报⽂提示服务端在此之后的报⽂是采⽤pre_master_secre 加密的。

  ⑦ 客户端向服务端发送⼀个 finish 报⽂,这次握⼿中包含第⼀次握⼿⾄今所有报⽂的整体校验值,最终协商是否完成取决于服务端能否成功解密。

  ⑧ 服务端同样发送与第 ⑥ 步中相同作⽤的报⽂,已让客户端进⾏确认,最后发送 finish 报⽂告诉客户端⾃⼰能够正确解密报⽂。当服务端和客户端的 finish 报⽂交换完成之后,SSL 连接就算建⽴完成了,之后就进⾏和 HTTP 相同的通信过程,唯⼀不同的是在 HTTP 通信过程中并不是采⽤明⽂传输,⽽是采⽤对称加密的⽅式,其中对称密钥已经在 SSL 的建⽴过程中协商好了。

  HTTPS 采⽤对称加密和⾮对称加密相结合的⽅式,⾸先使⽤ SSL/TLS 协议进⾏加密传输,为了弥补⾮对称加密的缺点,HTTPS 采⽤证书来进⼀步加强⾮对称加密的安全性,通过⾮对称加密,客户端和服务端协商好之后进⾏通信传输的对称密钥,后续的所有信息都通过该对称秘钥进⾏加密解密,完成整个 HTTPS 的流程。

  HTTP 状态码由三个⼗进制数字组成,第⼀个数字定义了状态码的类型,后两个并没有起到分类的作⽤。HTTP 状态码共有 5 种类型:

  301:永久移动。请求的资源已被永久的移动到新的URI,旧的地址已经被永久的删除了。返回信息会包括新的URI,浏览器会⾃动定向到新的URI。今后新的请求都应使⽤新的URI代替。

  302:临时移动。与301类似,客户端拿到服务端的响应消息后会跳转到⼀个新的 URL 地址。但资源只是临时被移动,旧的地址还在,客户端应继续使⽤原有URI。

  ② HTTP 异常状态码知道哪些?该问题⼀般只需要回答 3, 4 , 5 开头的⼀些常⻅异常状态

  节约带宽: 当客户端请求某个资源时,HTTP/1.0 默认将该资源相关的整个对象传送给请求⽅,但很多时候可能客户端并不需要对象的所有信息。⽽在 HTTP/1.1 的请求头中引⼊了 range 头域,它允许只请求部分资源,其使得开发者可以多线程请求某⼀资源,从⽽充分的利⽤带宽资源,实现⾼效并发。错误通知的管理:HTTP/1.1 在 1.0 的基础上新增了 24 个错误状态响应码,例如 414 表示客户端请求中所包含的URL 地址太⻓,以⾄于服务器⽆法处理;410 表示所请求的资源已经被永久删除。

  Host 请求头:早期 HTTP/1.0 中认为每台服务器都绑定⼀个唯⼀的 IP 地址并提供单⼀的服务,请求消息中的 URL并没有传递主机名。⽽随着虚拟主机的出现,⼀台物理服务器上可以存在多个虚拟主机,并且它们共享同⼀个 IP地址。为了⽀持虚拟主机,HTTP/1.1 中添加了 host 请求头,请求消息和响应消息中应声明这个字段,若请求消息中缺少该字段时服务端会响应⼀个 404 错误状态码。

  ⻓连接:HTTP/1.0 默认浏览器和服务器之间保持短暂连接,浏览器的每次请求都需要与服务器建⽴⼀个 TCP 连接,服务器完成后⽴即断开 TCP 连接。HTTP/1.1 默认使⽤的是持久连接,其⽀持在同⼀个 TCP 请求中传送多个HTTP 请求和响应。此之前的 HTTP 版本的默认连接都是使⽤⾮持久连接,如果想要在旧版本的 HTTP 协议上维持持久连接,则需要指定 Connection 的⾸部字段的值为Keep-Alive。

  1. 相⽐于 HTTP/1.X 的⽂本(字符串)传送, HTTP/2.0采⽤⼆进制传送。客户端和服务器传输数据时把数据分成帧,帧组成了数据流,流具有流 ID 标识和优先级,通过优先级以及流依赖能够⼀定程度上解决关键请求被阻塞的问题。

  2. HTTP/2.0 ⽀持多路复⽤。因为流 ID 的存在, 通过同⼀个 HTTP 请求可以实现多个 HTTP 请求传输,客户端和服务器可以通过流 ID 来标识究竟是哪个流从⽽定位到是哪个 HTTP 请求。

  3. HTTP/2.0 头部压缩。HTTP/2.0 通过 gzip 和compress 压缩头部然后再发送,同时通信双⽅会维护⼀张头信息表,所有字段都记录在这张表中,在每次 HTTP 传输时只需要传头字段在表中的索引即可,⼤⼤减⼩了重传次数和数据量。

  4. HTTP/2.0 ⽀持服务器推送。 服务器在客户端未经请求许可的情况下,可预先向客户端推送需要的内容,客户端在退出服务时可通过发送复位相关的请求来取消服务端的推送。

  DNS(Domain Name System)是域名系统的英⽂缩写,是⼀种组织成域层次结构的计算机和⽹络服务命名系统,⽤于TCP/IP ⽹络。

  通常我们有两种⽅式识别主机:通过主机名或者 IP 地址。⼈们喜欢便于记忆的主机名表示,⽽路由器则喜欢定⻓的、有着层次结构的 IP 地址。为了满⾜这些不同的偏好,我们就需要⼀种能够进⾏主机名到 IP 地址转换的⽬录服务,域名系统作为将域名和 IP 地址相互映射的⼀个分布式数据库,能够使⼈更⽅便地访问互联⽹。

  上图展示了 DNS 服务器的部分层次结构,从上到下依次为根域名服务器、顶级域名服务器和权威域名服务器。其实根域名服务器在因特⽹上有13个,⼤部分位于北美洲。第⼆层为顶级域服务器,这些服务器负责顶级域名(如com、org、net、edu)和所有国家的顶级域名(如uk、fr、ca 和 jp)。在第三层为权威 DNS 服务器,因特⽹上具有公共可访问主机(例如 Web 服务器和邮件服务器)的每个组织机构必须提供公共可访问的 DNS 记录,这些记录由组织机构的权威 DNS 服务器负责保存,这些记录将这些主机的名称映射为 IP 地址。

  除此之外,还有⼀类重要的 DNS 服务器,叫做本地 DNS服务器。本地 DNS 服务器严格来说不在 DNS 服务器的层次结构中,但它对 DNS 层次结构是很重要的。⼀般来说,每个⽹络服务提供商(ISP) 都有⼀台本地 DNS 服务器。当主机与某个 ISP 相连时,该 ISP 提供⼀台主机的 IP地址,该主机具有⼀台或多台其本地 DNS 服务器的 IP 地址。主机的本地 DNS 服务器通常和主机距离较近,当主机发起 DNS 请求时,该请求被发送到本地 DNS 服务器,它起着代理的作⽤,并将该请求转发到 DNS 服务器层次结构中。

  我们以⼀个例⼦来了解 DNS 的⼯作原理,假设主机 A(IP地址为abc.xyz.edu) 想知道主机 B 的 IP 地址(def.mn.edu),如下图所示,主机 A ⾸先向它的本地DNS 服务器发送⼀个DNS 查询报⽂。该查询报⽂含有被转换的主机名def.mn.edu。本地 DNS 服务器将该报⽂转发到根 DNS 服务器,根 DNS 服务器注意到查询的 IP 地址前缀为 edu 后向本地 DNS 服务器返回负责 edu 的顶级域名服务器的IP 地址列表。该本地 DNS 服务器则再次向这些 顶级域名服务器发送查询报⽂。该顶级域名服务器注意到mn.edu的前缀,并⽤权威域名服务器的 IP 地址进⾏响应。通常情况下,顶级域名服务器并不总是知道每台主机的权威 DNS 服务器的 IP 地址,⽽只知道中间的某个服务器,该中间 DNS 服务器依次能找到⽤于相应主机的 IP地址,我们假设中间经历了权威服务器 ① 和 ②,最后找到了负责def.mn.edu的权威 DNS 服务器 ③,之后,本地DNS 服务器直接向该服务器发送查询报⽂从⽽获得主机 B的IP 地址。

  在上图中,IP 地址的查询其实经历了两种查询⽅式,分别是递归查询和迭代查询。拓展:域名解析查询的两种⽅式

  递归查询:如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户端的身份,向其他根域名服务器继续发出查询请求报⽂,即替主机继续查询,⽽不是让主机⾃⼰进⾏下⼀步查询,如上图步骤(1)和(10)。

  迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报⽂时,要么给出所要查询的 IP 地址,要么告诉本地服务器下⼀步应该找哪个域名服务器进⾏查询,然后让本地服务器进⾏后续的查询,如上图步骤(2) ~(9)。

  DNS 既使⽤ TCP ⼜使⽤ UDP。当进⾏区域传送(主域名服务器向辅助域名服务器传送变化的那部分数据)时会使⽤ TCP,因为数据同步传送的数据量⽐⼀个请求和应答的数据量要多,⽽ TCP 允许的报⽂⻓度更⻓,因此为了保证数据的正确性,会使⽤基于可靠连接的 TCP。

  当客户端向 DNS 服务器查询域名 (域名解析) 的时候,⼀般返回的内容不会超过 UDP 报⽂的最⼤⻓度,即 512 字节。⽤ UDP 传输时,不需要经过 TCP 三次握⼿的过程,从⽽⼤⼤提⾼了响应速度,但这要求域名解析器和域名服务器都必须⾃⼰处理超时和重传从⽽保证可靠性。

  DNS 劫持即域名劫持,是通过将原域名对应的 IP 地址进⾏替换从⽽使得⽤户访问到错误的⽹站或者使得⽤户⽆法正常访问⽹站的⼀种攻击⽅式。域名劫持往往只能在特定的⽹络范围内进⾏,范围外的 DNS 服务器能够返回正常的 IP 地址。攻击者可以冒充原域名所属机构,通过电⼦邮件的⽅式修改组织机构的域名注册信息,或者将域名转让给其它组织,并将新的域名信息保存在所指定的 DNS服务器中,从⽽使得⽤户⽆法通过对原域名进⾏解析来访问⽬的⽹址。

  ① 获取要劫持的域名信息:攻击者⾸先会访问域名查询站点查询要劫持的域名信息。

  ② 控制域名相应的 E-MAIL 账号:在获取到域名信息后,攻击者通过暴⼒破解或者专⻔的⽅法破解公司注册域名时使⽤的 E-mail 账号所对应的密码。更⾼级的攻击者甚⾄能够直接对 E-mail 进⾏信息窃取。

  ③ 修改注册信息:当攻击者破解了 E-MAIL 后,会利⽤相关的更改功能修改该域名的注册信息,包括域名拥有者信息,DNS 服务器信息等。

  ④ 使⽤ E-MAIL 收发确认函:在修改完注册信息后,攻击者在 E-mail 真正拥有者之前收到修改域名注册信息的相关确认信息,并回复确认修改⽂件,待⽹络公司恢复已成功修改信件后,攻击者便成功完成 DNS 劫持。

  直接通过 IP 地址访问⽹站,避开 DNS 劫持。 由于域名劫持往往只能在特定的⽹络范围内进⾏,因此⼀些⾼级⽤户可以通过⽹络设置让 DNS 指向正常的域名服务器以实现对⽬的⽹址的正常访问,例如将计算机⾸选 DNS 服务器的地址固定为 8.8.8.8。

  套接字(Socket)是对⽹络中不同主机上的应⽤进程之间进⾏双向通信的端点的抽象,⽹络进程通信的⼀端就是⼀个套接字,不同主机上的进程便是通过套接字发送报⽂来进⾏通信。例如 TCP ⽤主机的 IP 地址 + 端⼝号作为 TCP连接的端点,这个端点就叫做套接字。

  1. 流套接字(SOCK_STREAM):流套接字基于 TCP 传输协议,主要⽤于提供⾯向连接、可靠的数据传输服务。由于 TCP 协议的特点,使⽤流套接字进⾏通信时能够保证数据⽆差错、⽆重复传送,并按顺序接收,通信双⽅不需要在程序中进⾏相应的处理。

  2. 数据报套接字(SOCK_DGRAM):和流套接字不同,数据报套接字基于 UDP 传输协议,对应于⽆连接的 UDP 服务应⽤。该服务并不能保证数据传输的可靠性,也⽆法保证对端能够顺序接收到数据。此外,通信两端不需建⽴⻓时间的连接关系,当 UDP客户端发送⼀个数据给服务器后,其可以通过同⼀个套接字给另⼀个服务器发送数据。当⽤ UDP 套接字时,丢包等问题需要在程序中进⾏处理。

  3. 原始套接字(SOCK_RAW):由于流套接字和数据报套接字只能读取 TCP 和 UDP 协议的数据,当需要传送⾮传输层数据包(例如 Ping 命令时⽤的 ICMP 协议数据包)或者遇到操作系统⽆法处理的数据包时,此时就需要建⽴原始套接字来发送。

  URL,即统⼀资源定位符(Uniform Resource Locator ),URL 其实就是我们平时上⽹时输⼊的⽹址,它标识⼀个互联⽹资源,并指定对其进⾏操作或获取该资源的⽅法。例如set/… 这个URL,标识⼀个特定资源并表示该资源的某种形式是可以通过 HTTP 协议从相应位置获得。

  从定义即可看出,URL 是 URI 的⼀个⼦集,两者都定义了资源是什么,⽽URL 还定义了如何能访问到该资源。URI是⼀种语义上的抽象概念,可以是绝对的,也可以是相对的,⽽URL则必须提供⾜够的信息来定位,是绝对的。简单地说,只要能唯⼀标识资源的就是 URI,在URI 的基础上给出其资源的访问⽅式的就是 URL。

  假如我们需要抓取客户端的数据包,需要监控客户端与服务器交互之间的⽹络节点,监控其中任意⼀个⽹络节点(⽹卡),获取所有经过⽹卡中的数据,对这些数据按照⽹络协议进⾏解析,这就是抓包的基本原理。⽽中间的⽹络节点不受我们控制,是基本⽆法实现抓包的,因此只能在客户端与服务器之间进⾏抓包。

  ① ⾸先最直接的⽅法是查看本地⽹络是否正常,可以通过⽹络测速软件例如电脑管家等对电脑进⾏测速,若⽹速正常,我们查看⽹络带宽是否被占⽤,例如当你正在下载电影时并且没有限速,是会影响你打开⽹⻚的速度的,这种情况往往是处理器内存⼩导致的;

  ② 当⽹速测试正常时,我们对⽹站服务器速度进⾏排查,通过 ping 命令查看链接到服务器的时间和丢包等情况,⼀个速度好的机房,⾸先丢包率不能超过 1%,其次 ping值要⼩,最后是 ping 值要稳定,如最⼤和最⼩差值过⼤说明路由不稳定。或者我们也可以查看同台服务器上其他⽹站的打开速度,看是否其他⽹站打开也慢。

  ③ 如果⽹⻚打开的速度时快时慢,甚⾄有时候打不开,有可能是空间不稳定的原因。当确定是该问题时,就要找你的空间商解决或换空间商了,如果购买空间的话,可选择购买购买双线空间或多线空间;如果是在有的地⽅打开速度快,有的地⽅打开速度慢,那应该是⽹络线路的问题。电信线路⽤户访问放在联通服务器的⽹站,联通线路⽤户访问放在电信服务器上的⽹站,相对来说打开速度肯定是⽐较慢。

  ④ 从⽹站本身找原因。⽹站的问题主要包括⽹站程序设计、⽹⻚设计结构和⽹⻚内容三个部分。

  ⽹站程序设计:当访问⽹⻚中有拖慢⽹站打开速度的代码,会影响⽹⻚的打开速度,例如⽹⻚中的统计代码,我们最好将其放在⽹站的末尾。因此我们需要查看⽹⻚程序的设计结构是否合理;

  ⽹⻚设计结构:如果是 table 布局的⽹站,查看是否嵌套次数太多,或是⼀个⼤表格分成多个表格这样的⽹⻚布局,此时我们可以采⽤ div 布局并配合 css 进⾏优化。

  ⽹⻚内容:查看⽹⻚中是否有许多尺⼨⼤的图⽚或者尺⼨⼤的 flash 存在,我们可以通过降低图⽚质量,减⼩图⽚尺⼨,少⽤⼤型 flash 加以解决。此外,有的⽹⻚可能过多地引⽤了其他⽹站的内容,若某些被引⽤的⽹站访问速度慢,或者⼀些⻚⾯已经不存在了,打开的速度也会变慢。⼀种直接的解决⽅法是去除不必要的加载项。

  ① DNS 解析:当⽤户输⼊⼀个⽹址并按下回⻋键的时候,浏览器获得⼀个域名,⽽在实际通信过程中,我们需要的是⼀个 IP 地址,因此我们需要先把域名转换成相应IP 地址。【具体细节参看问题 16,17】

  ② TCP 连接:浏览器通过 DNS 获取到 Web 服务器真正的IP 地址后,便向 Web 服务器发起 TCP 连接请求,通过TCP 三次握⼿建⽴好连接后,浏览器便可以将 HTTP 请求数据发送给服务器了。【三次握⼿放在传输层详细讲解】

  ③ 发送 HTTP 请求:浏览器向 Web 服务器发起⼀个HTTP 请求,HTTP 协议是建⽴在 TCP 协议之上的应⽤层协议,其本质是在建⽴起的TCP连接中,按照HTTP协议标准发送⼀个索要⽹⻚的请求。在这⼀过程中,会涉及到负载均衡等操作。

  负载均衡,英⽂名为 Load Balance,其含义是指将负载(⼯作任务)进⾏平衡、分摊到多个操作单元上进⾏运⾏,例如 FTP 服务器、Web 服务器、企业核⼼服务器和其他主要任务服务器等,从⽽协同完成⼯作任务。负载均衡建⽴在现有的⽹络之上,它提供了⼀种透明且廉价有效的⽅法扩展服务器和⽹络设备的带宽、增加吞吐量、加强⽹络处理能⼒并提⾼⽹络的灵活性和可⽤性。

  负载均衡是分布式系统架构设计中必须考虑的因素之⼀,例如天猫、京东等⼤型⽤户⽹站中为了处理海量⽤户发起的请求,其往往采⽤分布式服务器,并通过引⼊反向代理等⽅式将⽤户请求均匀分发到每个服务器上,⽽这⼀过程所实现的就是负载均衡。

  ④ 处理请求并返回:服务器获取到客户端的 HTTP 请求后,会根据 HTTP 请求中的内容来决定如何获取相应的⽂件,并将⽂件发送给浏览器。

  ⑤ 浏览器渲染:浏览器根据响应开始显示⻚⾯,⾸先解析HTML ⽂件构建 DOM 树,然后解析 CSS ⽂件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。

  ⑥ 断开连接:客户端和服务器通过四次挥⼿终⽌ TCP 连接。【其中的细节放在传输层详细讲解】

  ② 服务器接收到客户端发来的 SYN 包后,对该包进⾏确认后结束 LISTEN 阶段,并返回⼀段 TCP 报⽂,其中:

  标志位为 SYN 和 ACK,表示确认客户端的报⽂ Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;

  确认号为 Ack = x + 1,表示收到客户端的序号 Seq并将其值加 1 作为⾃⼰确认号 Ack 的值,随后服务器端进⼊ SYN-RCVD 阶段。

  ③ 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的,从⽽结束 SYN-SENT阶段。并返回最后⼀段报⽂。其中:

  序号为 Seq = x + 1,表示收到服务器端的确认号Ack,并将其值作为⾃⼰的序号值;

  确认号为 Ack= y + 1,表示收到服务器端序号 seq,并将其值加 1 作为⾃⼰的确认号 Ack 的值。

  当服务器端收到来⾃客户端确认收到服务器数据的报⽂后,得知从服务器到客户端的数据传输是正常的,从⽽结束 SYN-SEND 阶段,进⼊ ESTABLISHED 阶段,从⽽完成三次握⼿。

  四次挥⼿即 TCP 连接的释放,这⾥假设客户端主动释放连接。在挥⼿之前主动释放连接的客户端结束ESTABLISHED 阶段,随后开始四次挥⼿:

  ① ⾸先客户端向服务器发送⼀段 TCP 报⽂表明其想要释放 TCP 连接,其中:

  随后客户端进⼊ FIN-WAIT-1 阶段,即半关闭阶段,并且停⽌向服务端发送通信数据。

  确认号为 Ack = u + 1,表示是在收到客户端报⽂的基础上,将其序号值加 1 作为本段报⽂确认号 Ack 的值;

  客户端收到服务器发送过来的 TCP 报⽂后,确认服务器已经收到了客户端连接释放的请求,随后客户端结束 FIN-WAIT-1 阶段,进⼊ FIN-- WAIT-2 阶段。

  ③ 服务器端在发出 ACK 确认报⽂后,服务器端会将遗留的待传数据传送给客户端,待传输完成后即经过 CLOSEWAIT 阶段,便做好了释放服务器端到客户端的连接准备,再次向客户端发出⼀段 TCP 报⽂,其中:

  确认号 Ack = u + 1,表示是在收到客户端报⽂的基础上,将其序号 Seq 的值加 1 作为本段报⽂确认号 Ack的值。

  随后服务器端结束 CLOSE-WAIT 阶段,进⼊ LASTACK 阶段。并且停⽌向客户端发送数据。

  ④ 客户端收到从服务器发来的 TCP 报⽂,确认了服务器已经做好释放连接的准备,于是结束 FIN-WAIT-2 阶段,进⼊ TIME-WAIT 阶段,并向服务器发送⼀段报⽂,其中:

  标记位为 ACK,表示接收到服务器准备好释放连接的信号;序号为 Seq= u + 1,表示是在已收到服务器报⽂的基础上,将其确认号 Ack 值作为本段序号的值;

  确认号为 Ack= w + 1,表示是在收到了服务器报⽂的基础上,将其序号 Seq 的值作为本段报⽂确认号的值。

  随后客户端开始在 TIME-WAIT 阶段等待 2 MSL。服务器端收到从客户端发出的 TCP 报⽂之后结束 LAST-ACK 阶段,进⼊ CLOSED 阶段。由此正式确认关闭服务器端到客户端⽅向上的连接。客户端等待完 2 MSL 之后,结束TIME-WAIT 阶段,进⼊ CLOSED 阶段,由此完成「四次挥⼿」。

  若第⼀次握⼿服务器未接收到客户端请求建⽴连接的数据包时,服务器不会进⾏任何相应的动作,⽽客户端由于在⼀段时间内没有收到服务器发来的确认报⽂, 因此会等待⼀段时间后重新发送 SYN 同步报⽂,若仍然没有回应,则重复上述过程直到发送次数超过最⼤重传次数限制后,建⽴连接的系统调⽤会返回 -1。

  若第⼆次握⼿客户端未接收到服务器回应的 ACK 报⽂时,客户端会采取第⼀次握⼿失败时的动作,这⾥不再重复,⽽服务器端此时将阻塞在 accept() 系统调⽤处等待 client 再次发送 ACK 报⽂。

  若第三次握⼿服务器未接收到客户端发送过来的 ACK报⽂,同样会采取类似于客户端的超时重传机制,若重传次数超过限制后仍然没有回应,则 accep() 系统调⽤返回 -1,服务器端连接建⽴失败。但此时客户端认为⾃⼰已经连接成功了,因此开始向服务器端发送数据,但是服务器端的 accept() 系统调⽤已返回,此时没有在监听状态。因此服务器端接收到来⾃客户端发送来的数据时会发送RST报⽂给 客户端,消除客户端单⽅⾯建⽴连接的状态。

  三次握⼿的主要⽬的是确认⾃⼰和对⽅的发送和接收都是正常的,从⽽保证了双⽅能够进⾏可靠通信。若采⽤两次握⼿,当第⼆次握⼿后就建⽴连接的话,此时客户端知道服务器能够正常接收到⾃⼰发送的数据,⽽服务器并不知道客户端是否能够收到⾃⼰发送的数据。

  我们知道⽹络往往是⾮理想状态的(存在丢包和延迟),当客户端发起创建连接的请求时,如果服务器直接创建了这个连接并返回包含 SYN、ACK 和 Seq 等内容的数据包给客户端,这个数据包因为⽹络传输的原因丢失了,丢失之后客户端就⼀直接收不到返回的数据包。由于客户端可能设置了⼀个超时时间,⼀段时间后就关闭了连接建⽴的请求,再重新发起新的请求,⽽服务器端是不知道的,如果没有第三次握⼿告诉服务器客户端能否收到服务器传输的数据的话,服务器端的端⼝就会⼀直开着,等到客户端因超时重新发出请求时,服务器就会重新开启⼀个端⼝连接。⻓此以往, 这样的端⼝越来越多,就会造成服务器开销的浪费。

  ACK 是为了告诉客户端发来的数据已经接收⽆误,⽽传回SYN 是为了告诉客户端,服务端收到的消息确实是客户端发送的消息。

  释放 TCP 连接时之所以需要四次挥⼿,是因为 FIN 释放连接报⽂和 ACK 确认接收报⽂是分别在两次握⼿中传输的。 当主动⽅在数据传送结束后发出连接释放的通知,由于被动⽅可能还有必要的数据要处理,所以会先返回 ACK确认收到报⽂。当被动⽅也没有数据再发送的时候,则发出连接释放通知,对⽅确认后才完全关闭TCP连接。

  举个例⼦:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着⾃⼰的节奏结束通话,于是 B 可能⼜巴拉巴拉说了⼀通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。

  在服务器收到客户端关闭连接的请求并告诉客户端⾃⼰已经成功收到了该请求之后,服务器进⼊了CLOSE-WAIT状态,然⽽此时有可能服务端还有⼀些数据没有传输完成,因此不能⽴即关闭连接,⽽CLOSE-WAIT 状态就是为了保证服务器在关闭连接之前将待发送的数据发送完成。

  TIME-WAIT 发⽣在第四次挥⼿,当客户端向服务端发送ACK 确认报⽂后进⼊该状态,若取消该状态,即客户端在收到服务端的 FIN 报⽂后⽴即关闭连接,此时服务端相应的端⼝并没有关闭,若客户端在相同的端⼝⽴即建⽴新的连接,则有可能接收到上⼀次连接中残留的数据包,可能会导致不可预料的异常出现。除此之外,假设客户端最后⼀次发送的 ACK 包在传输的时候丢失了,由于 TCP 协议的超时重传机制,服务端将重发 FIN 报⽂,若客户端并没有维持 TIME-WAIT 状态⽽直接关闭的话,当收到服务端重新发送的 FIN 包时,客户端就会⽤ RST 包来响应服务端,这将会使得对⽅认为是有错误发⽣,然⽽其实只是正常的关闭连接过程,并没有出现异常情况。

  我们考虑⾼并发短连接的业务场景,在⾼并发短连接的TCP 服务器上,当服务器处理完请求后主动请求关闭连接,这样服务器上会有⼤量的连接处于 TIME_WAIT 状态,服务器维护每⼀个连接需要⼀个 socket,也就是每个连接会占⽤⼀个⽂件描述符,⽽⽂件描述符的使⽤是有上限的,如果持续⾼并发,会导致⼀些正常的 连接失败。

  解决⽅案:修改配置或设置 SO_REUSEADDR 套接字,使得服务器处于 TIME-WAIT 状态下的端⼝能够快速回收和重⽤。

  当客户端发出最后的 ACK 确认报⽂时,并不能确定服务器端能够收到该段报⽂。所以客户端在发送完 ACK 确认报⽂之后,会设置⼀个时⻓为 2 MSL 的计时器。MSL(Maximum Segment Lifetime),指⼀段 TCP 报⽂在传输过程中的最⼤⽣命周期。2 MSL 即是服务器端发出FIN 报⽂和客户端发出的 ACK 确认报⽂所能保持有效的最⼤时⻓。

  若服务器在 1 MSL 内没有收到客户端发出的 ACK 确认报⽂,再次向客户端发出 FIN 报⽂。如果客户端在 2 MSL 内收到了服务器再次发来的 FIN 报⽂,说明服务器由于⼀些原因并没有收到客户端发出的 ACK 确认报⽂。客户端将再次向服务器发出 ACK 确认报⽂,并重新开始 2 MSL 的计时。

  若客户端在 2MSL 内没有再次收到服务器发送的 FIN 报⽂,则说明服务器正常接收到客户端 ACK 确认报⽂,客户端可以进⼊ CLOSE 阶段,即完成四次挥⼿。

  (此处有个疑问:如果首先第四次服务端没有收到ack报文,在重新发送fin报文的时候,客户端又没有收到,但是此时2msl已过。客户端以为服务端收到ack报文,但是事实上服务端没有收到。这种情况怎么办。此时2msl不是没有意义了吗)

  所以客户端要经历 2 MSL 时⻓的 TIME-WAIT 阶段,为的是确认服务器能否接收到客户端发出的 ACK 确认报⽂。

  服务器可以设置 SO_REUSEADDR 套接字选项来通知内核,如果端⼝被占⽤,但 TCP 连接位于 TIME_WAIT 状态时可以重⽤端⼝。如果你的服务器程序停⽌后想⽴即重启,⽽新的套接字依旧希望使⽤同⼀端⼝,此时SO_REUSEADDR 选项就可以避免 TIME-WAIT 状态。也可以采⽤⻓连接的⽅式减少 TCP 的连接与断开,在⻓连接的业务中往往不需要考虑 TIME-WAIT 状态,但其实在⻓连接的业务中并发量⼀般不会太⾼。

  ⾸先检查是不是⾃⼰的代码问题(看是否服务端程序忘记关闭连接),如果是,则修改代码。调整系统参数,包括句柄相关参数和 TCP/IP 的参数,⼀般⼀个 CLOSE_WAIT 会维持⾄少 2 个⼩时的时间,我们可以通过调整参数来缩短这个时间。

  建⽴连接定时器:顾名思义,该定时器是在建⽴ TCP连接的时候使⽤的,在 TCP 三次握⼿的过程中,发送⽅发送 SYN 时,会启动⼀个定时器(默认为 3秒),若 SYN 包丢失了,那么 3 秒以后会重新发送SYN 包,直到达到重传次数。

  重传定时器:该计时器主要⽤于 TCP 超时重传机制中,当TCP 发送报⽂段时,就会创建特定报⽂的重传计时器,并可能出现两种情况:

  ① 若在计时器截⽌之前发送⽅收到了接收⽅的 ACK 报⽂,则撤销该计时器;

  ② 若计时器截⽌时间内并没有收到接收⽅的 ACK 报⽂,则发送⽅重传报⽂,并将计时器复位。

  坚持计时器:我们知道 TCP 通过让接受⽅指明希望从发送⽅接收的数据字节数(窗⼝⼤⼩)来进⾏流量控制,当接收端的接收窗⼝满时,接收端会告诉发送端此时窗⼝已满,请停⽌发送数据。此时发送端和接收端的窗⼝⼤⼩均为0,直到窗⼝变为⾮0时,接收端将发送⼀个 确认 ACK 告诉发送端可以再次发送数据,但是该报⽂有可能在传输时丢失。若该 ACK 报⽂丢失,则双⽅可能会⼀直等待下去,为了避免这种死锁情况的发⽣,发送⽅使⽤⼀个坚持定时器来周期性地向接收⽅发送探测报⽂段,以查看接收⽅窗⼝是否变⼤。

  延迟应答计时器:延迟应答也被称为捎带 ACK,这个定时器是在延迟应答的时候使⽤的,为了提⾼⽹络传输的效率,当服务器接收到客户端的数据后,不是⽴即回 ACK 给客户端,⽽是等⼀段时间,这样如果服务端有数据需要发送给客户端的话,就可以把数据和ACK ⼀起发送给客户端了。

  保活定时器:该定时器是在建⽴ TCP 连接时指定SO_KEEPLIVE 时才会⽣效,当发送⽅和接收⽅⻓时间没有进⾏数据交互时,该定时器可以⽤于确定对端是否还活着。

  FIN_WAIT_2 定时器:当主动请求关闭的⼀⽅发送 FIN报⽂给接收端并且收到其对 FIN 的确认 ACK后进⼊FIN_WAIT_2状态。如果这个时候因为⽹络突然断掉、被动关闭的⼀端宕机等原因,导致请求⽅没有收到接收⽅发来的 FIN,主动关闭的⼀⽅会⼀直等待。该定时器的作⽤就是为了避免这种情况的发⽣。当该定时器超时的时候,请求关闭⽅将不再等待,直接释放连接。

  TIME_WAIT 定时器:我们知道在 TCP 四次挥⼿中,发送⽅在最后⼀次挥⼿之后会进⼊ TIME_WAIT 状态,不直接进⼊ CLOSE 状态的主要原因是被动关闭⽅万⼀在超时时间内没有收到最后⼀个 ACK,则会重发最后的 FIN,2 MSL(报⽂段最⼤⽣存时间)等待时间保证了重发的 FIN 会被主动关闭的⼀段收到且重新发送最后⼀个 ACK 。还有⼀个原因是在这 2 MSL的时间段内任何迟到的报⽂段会被接收⽅丢弃,从⽽防⽌⽼的 TCP 连接的包在新的 TCP 连接⾥⾯出现。

  序列号和确认应答:TCP 给发送的每⼀个包进⾏编号,在传输的过程中,每次接收⽅收到数据后,都会对传输⽅进⾏确认应答,即发送 ACK 报⽂,这个 ACK 报⽂当中带有对应的确认序列号,告诉发送⽅成功接收了哪些数据以及下⼀次的数据从哪⾥开始发。除此之外,接收⽅可以根据序列号对数据包进⾏排序,把有序数据传送给应⽤层,并丢弃重复的数据。

  校验和: TCP 将保持它⾸部和数据部分的检验和。这是⼀个端到端的检验和,⽬的是检测数据在传输过程中的任何变化。如果收到报⽂段的检验和有差错,TCP 将丢弃这个报⽂段并且不确认收到此报⽂段。

  流量控制: TCP 连接的双⽅都有⼀个固定⼤⼩的缓冲空间,发送⽅发送的数据量不能超过接收端缓冲区的⼤⼩。当接收⽅来不及处理发送⽅的数据,会提示发送⽅降低发送的速率,防⽌产⽣丢包。TCP 通过滑动窗⼝协议来⽀持流量控制机制。

  ARQ协议自动重传请求(Automatic Repeat-reQuest,ARQ): 也是为了实现可靠传输的,它的基本原理就是每发完⼀个分组就停⽌发送,等待对⽅确认。在收到确认后再发下⼀个分组。

  超时重传: 当 TCP 发出⼀个报⽂段后,它启动⼀个定时器,等待⽬的端确认收到这个报⽂段。如果超过某个时间还没有收到确认,将重发这个报⽂段。

  UDP 只有⼀个 socket 接收缓冲区,没有 socket 发送缓冲区,即只要有数据就发,不管对⽅是否可以正确接收。⽽在对⽅的 socket 接收缓冲区满了之后,新来的数据报⽆法进⼊到 socket 接受缓冲区,此数据报就会被丢弃,此 UDP 不能保证数据能够到达⽬的地,此外,UDP 也没有流量控制和重传机制,故UDP的数据传输是不可靠的。

  和 TCP 建⽴连接时采⽤三次握⼿不同,UDP 中调⽤connect 只是把对端的 IP 和 端⼝号记录下来,并且 UDP可多多次调⽤ connect 来指定⼀个新的 IP 和端⼝号,或者断开旧的 IP 和端⼝号(通过设置 connect 函数的第⼆个参数)。和普通的 UDP 相⽐,调⽤ connect 的 UDP 会提升效率,并且在⾼并发服务中会增加系统稳定性。

  当 UDP 的发送端调⽤ bind 函数时,就会将这个套接字指定⼀个端⼝,若不调⽤ bind 函数,系统内核会随机分配⼀个端⼝给该套接字。当⼿动绑定时,能够避免内核来执⾏这⼀操作,从⽽在⼀定程度上提⾼性能。

  发送⽅在发送⼀次数据后就开启⼀个定时器,在⼀定时间内如果没有得到发送数据包的 ACK 报⽂,那么就重新发送数据,在达到⼀定次数还没有成功的话就放弃重传并发送⼀个复位信号。其中超时时间的计算是超时的核⼼,⽽定时时间的确定往往需要进⾏适当的权衡,因为当定时时间过⻓会造成⽹络利⽤率不⾼,定时太短会造成多次重传,使得⽹络阻塞。在 TCP 连接过程中,会参考当前的⽹络状况从⽽找到⼀个合适的超时时间。

  停⽌等待协议是为了实现 TCP 可靠传输⽽提出的⼀种相对简单的协议,该协议指的是发送⽅每发完⼀组数据后,直到收到接收⽅的确认信号才继续发送下⼀组数据。我们通过四种情形来帮助理解停等协议是如何实现可靠传输的:

  如上述左图所示,A 发送分组 Msg 1,发完就暂停发送,直到收到接收⽅确认收到 Msg 1 的报⽂后,继续发送 Msg2,以此类推,该情形是通信中的⼀种理想状态。

  如上述右图所示,发送⽅发送的报⽂出现差错导致接收⽅不能正确接收数据,出现差错的情况主要分为两种:发送⽅发送的 Msg 1 在中途丢失了,接收⽅完全没收到数据。接收⽅收到 Msg 1 后检测出现了差错,直接丢弃 Msg1。

  上⾯两种情形,接收⽅都不会回任何消息给发送⽅,此时就会触发超时传输机制,即发送⽅在等待⼀段时间后仍然没有收到接收⽅的确认,就认为刚才发送的数据丢失了,

  当接收⽅回应的 Msg 1 确认报⽂在传输过程中丢失,发送⽅⽆法接收到确认报⽂。于是发送⽅等待⼀段时间后重传Msg 1,接收⽅将收到重复的 Msg1 数据包,此时接收⽅会丢弃掉这个重复报⽂并向发送⽅再次发送 Msg1 的确认报⽂。

  当接收⽅回应的 Msg 1 确认报⽂由于⽹络各种原因导致发送⽅没有及时收到,此时发送⽅在超时重传机制的作⽤下再次发送了 Msg 数据包,接收⽅此时进⾏和确认丢失情形下相同的动作(丢弃重复的数据包并再次发送 Msg 1 确认报⽂)。发送⽅此时收到了接收⽅的确认数据包,于是继续进⾏数据发送。过了⼀段时间后,发送⽅收到了迟到的 Msg 1 确认包会直接丢弃。

  client 在每次发起 TCP 连接请求时,如果⾃⼰并不指定端⼝的话,系统会随机选择⼀个本地端⼝(local port),该端⼝是独占的,不能和其他 TCP 连接共享。TCP 端⼝的数据类型是 unsigned short,因此本地端⼝个数最⼤只有65536,除了端⼝ 0不能使⽤外,其他端⼝在空闲时都可以正常使⽤,这样可⽤端⼝最多有65535个。

  server 通常固定在某个本地端⼝上监听,等待 client 的连接请求。不考虑地址重⽤(Unix 的 SO_REUSEADDR 选项)的情况下,即使 server 端有多个 IP,本地监听端⼝也是独占的,因此 server 端 TCP 连接 4 元组中只有客户端的 IP 地址和端⼝号是可变的,因此最⼤ TCP 连接为客户端 IP 数 × 客户端 port 数,对 IPV4,在不考虑 IP 地址分类的情况下,最⼤ TCP 连接数约为2 的 32 次⽅(IP数)× 2 的 16 次⽅(port 数),也就是 server 端单机最⼤ TCP 连接数约为 2 的 48 次⽅。(就很抽象)

  然⽽上⾯给出的是只是理论上的单机最⼤连接数,在实际环境中,受到明⽂规定(⼀些 IP 地址和端⼝具有特殊义,没有对外开放)、机器资源、操作系统等的限制,特别是 sever 端,其最⼤并发 TCP 连接数远不能达到理论上限。对 server 端,通过增加内存、修改最⼤⽂件描述符个数等参数,单机最⼤并发 TCP 连接数超过 10 万是没问题的。

  所谓流量控制就是让发送⽅的发送速率不要太快,让接收⽅来得及接收。如果接收⽅来不及接收发送⽅发送的数据,那么就会有分组丢失。在 TCP 中利⽤可边⻓的滑动窗⼝机制可以很⽅便的在 TCP 连接上实现对发送⽅的流量控制。主要的⽅式是接收⽅返回的 ACK 中会包含⾃⼰的接收窗⼝⼤⼩,以控制发送⽅此次发送的数据量⼤⼩(发送窗⼝⼤⼩)。

  在实际的⽹络通信系统中,除了发送⽅和接收⽅外,还有路由器,交换机等复杂的⽹络传输线路,此时就需要拥塞控制。拥塞控制是作⽤于⽹络的,它是防⽌过多的数据注⼊到⽹络中,避免出现⽹络负载过⼤的情况。常⽤的解决⽅法有:慢开始和拥塞避免、快重传和快恢复。

  拥塞控制往往是⼀种全局的,防⽌过多的数据注⼊到⽹络之中,⽽TCP连接的端点只要不能收到对⽅的确认信息,猜想在⽹络中发⽣了拥塞,但并不知道发⽣在何处,因此,流量控制往往指点对点通信量的控制,是端到端的问题。

  基于 TCP 流量控制中的滑动窗⼝协议,我们知道接收⽅返回给发送⽅的ACK 包中会包含⾃⼰的接收窗⼝⼤⼩,若接收窗⼝已满,此时接收⽅返回给发送⽅的接收窗⼝⼤⼩为 0,此时发送⽅会等待接收⽅发送的窗⼝⼤⼩直到变为⾮ 0 为⽌,然⽽,接收⽅回应的ACK 包是存在丢失的可能的,为了防⽌双⽅⼀直等待⽽出现死锁情况,此时就需要坚持计时器来辅助发送⽅周期性地向接收⽅查询,以便发现窗⼝是否变⼤【坚持计时器参考问题】,当发现窗⼝⼤⼩变为⾮零时,发送⽅便继续发送数据。

  当发送⽅开始发送数据时,由于⼀开始不知道⽹络负荷情况,如果⽴即将⼤量的数据字节传输到⽹络中,那么就有可能引起⽹络拥塞。⼀个较好的⽅法是在⼀开始发送少量的数据先探测⼀下⽹络状况,即由⼩到⼤的增⼤发送窗⼝(拥塞窗⼝ cwnd)。慢开始的慢指的是初始时令 cwnd为1,即⼀开始发送⼀个报⽂段。如果收到确认,则 cwnd =2,之后每收到⼀个确认报⽂,就令cwnd = cwnd* 2。但是,为了防⽌拥塞窗⼝增⻓过⼤⽽引起⽹络拥塞,另外设置了⼀个慢开始⻔限 ssthresh。

  拥塞控制是为了让拥塞窗⼝ cwnd 缓慢地增⼤,即每经过⼀个往返时间 RTT (往返时间定义为发送⽅发送数据到收到确认报⽂所经历的时间)就把发送⽅的 cwnd 值加1,通过让 cwnd线性增⻓,防⽌很快就遇到⽹络拥塞状态。

  当⽹络拥塞发⽣时,让新的慢开始⻔限值变为发⽣拥塞时候的值的⼀半,并将拥塞窗⼝置为 1,然后再次重复两种算法(慢开始和拥塞避免),这时⼀瞬间会将⽹络中的数据量⼤量降低。

  快重传算法要求接收⽅每收到⼀个失序的报⽂就⽴即发送重复确认,⽽不要等到⾃⼰发送数据时才捎带进⾏确认,假定发送⽅发送了 Msg 1 ~ Msg 4 这 4 个报⽂,已知接收⽅收到了 Msg 1,Msg 3 和 Msg 4 报⽂,此时因为接收到收到了失序的数据包,按照快重传的约定,接收⽅应⽴即向发送⽅发送 Msg 1 的重复确认。 于是在接收⽅收到Msg 4 报⽂的时候,向发送⽅发送的仍然是 Msg 1 的重复确认。这样,发送⽅就收到了 3 次 Msg 1 的重复确认,于是⽴即重传对⽅未收到的 Msg 报⽂。由于发送⽅尽早重传未被确认的报⽂段,因此,快重传算法可以提⾼⽹络的吞吐量。

  ① 当发送⽅连续收到三个重复确认,执⾏乘法减⼩,慢开始⻔限 ssthresh 值减半;

  ② 由于发送⽅可能认为⽹络现在没有拥塞,因此与慢开始不同,把 cwnd 值设置为 ssthresh 减半之后的值,然后执⾏拥塞避免算法,线性增⼤ cwnd。

  ② 发送⽅写⼊的数据⼩于套接字缓冲区⼤⼩,由于 TCP默认使⽤ Nagle 算法,只有当收到⼀个确认后,才将分组发送给对端,当发送⽅收集了多个较⼩的分组,就会⼀起发送给对端,这将会发⽣粘包。

  ④ 发送⽅发送的数据太快,接收⽅处理数据的速度赶不上发送端的速度,将发⽣粘包。

  ① 在消息的头部添加消息⻓度字段,服务端获取消息头的时候解析消息⻓度,然后向后读取相应⻓度的内容。

  ② 固定消息数据的⻓度,服务端每次读取既定⻓度的内容作为⼀条完整消息,当消息不够⻓时,空位补上固定字符。但是该⽅法会浪费⽹络资源。

  ③ 设置消息边界,也可以理解为分隔符,服务端从数据流中按消息边界分离出消息内容,⼀般使⽤换⾏符。什么时候需要处理粘包问题?当接收端同时收到多个分组,并且这些分组之间毫⽆关系时,需要处理粘包;⽽当多个分组属于同⼀数据的不同部分时,并不需要处理粘包问题。

  TCP 报⽂是 TCP 传输的的数据单元,也叫做报⽂段,其报⽂格式如下图所示:

  源端⼝和⽬的端⼝号:它⽤于多路复⽤/分解来⾃或送往上层应⽤的数据,其和 IP 数据报中的源 IP 与⽬的 IP 地址⼀同确定⼀条 TCP 连接。

  序号和确认号字段:序号是本报⽂段发送的数据部分中第⼀个字节的编号,在 TCP 传送的流中,每⼀个字节⼀个序号。例如⼀个报⽂段的序号为 100,此报⽂段数据部分共有 100 个字节,则下⼀个报⽂段的序号为 200。序号确保了 TCP 传输的有序性。确认号,即 ACK,指明下⼀个想要收到的字节序号,发送ACK 时表明当前序号之前的所有数据已经正确接收。这两个字段的主要⽬的是保证数据可靠传输。

  ⾸部⻓度:该字段指示了以 32 ⽐特的字为单位的TCP 的⾸部⻓度。其中固定字段⻓度为 20 字节,由于⾸部⻓度可能含有可选项内容,因此 TCP 报头的⻓度是不确定的,20 字节是 TCP ⾸部的最⼩⻓度。

  控制位:URG 表示紧急指针标志,该位为 1 时表示紧急指针有效,为 0 则忽略;ACK 为确认序号标志,即相应报⽂段包括⼀个对已被成功接收报⽂段的确认;PSH 为 push 标志,当该位为 1 时,则指示接收⽅在接收到该报⽂段以后,应尽快将这个报⽂段交给应⽤程序,⽽不是在缓冲区排队; RST 为重置连接标志,当出现错误连接时,使⽤此标志来拒绝⾮法的请求;SYN 为同步序号,在连接的建⽴过程中使⽤,例如三次握⼿时,发送⽅发送 SYN 包表示请求建⽴连接;FIN 为 finish 标志,⽤于释放连接,为 1 时表示发送⽅已经没有数据发送了,即关闭本⽅数据流。

  接收窗⼝:主要⽤于 TCP 流量控制。该字段⽤来告诉发送⽅其窗⼝(缓冲区)⼤⼩,以此控制发送速率,从⽽达到流量控制的⽬的。

  校验和:奇偶校验,此校验和是对整个 TCP 报⽂段,包括 TCP 头部和 数据部分。该校验和是⼀个端到端的校验和,由发送端计算和存储,并由接收端进⾏验证,主要⽬的是检验数据是否发⽣改动,若检测出差错,接收⽅会丢弃该 TCP 报⽂。

  紧急数据指针:紧急数据⽤于告知紧急数据所在的位置,在URG标志位为 1 时才有效。当紧急数据存在时,TCP 必须通知接收⽅的上层实体,接收⽅会对紧急模式采取相应的处理。

  ① TCP 连接初始化时,通信双⽅确认最⼤报⽂⻓度。② 在⾼速数据传输时,可使⽤该选项协商窗⼝扩⼤因⼦。

  ③ 作为时间戳时,提供⼀个 较为精准的 RTT,主要为了更好的实现 TCP 流量控制协议。

  数据:TCP 报⽂中的数据部分也是可选的,例如在TCP 三次握⼿和四次挥⼿过程中,通信双⽅交换的报⽂只包含头部信息,数据部分为空,只有当连接成功建⽴后,TCP 包才线. SYN FLOOD 是什么

  ,攻击者能够压倒⽬标服务器上的所有可⽤端⼝,导致⽬标设备根本不响应合法请求。其⽬的是通过消耗服务器所有可⽤资源使服务器⽆法⽤于处理合法请求。24. 为什么服务端易受到 SYN 攻击

  在 TCP 建⽴连接的过程中,因为服务端不确定⾃⼰发给客户端的 SYN-ACK 消息或客户端反馈的 ACK 消息是否会丢在半路,所以会给每个待完成的半开连接状态设⼀个定时器,如果超过时间还没有收到客户端的 ACK 消息,则重新发送⼀次 SYN-ACK 消息给客户端,直到重试超过⼀定次数时才会放弃。

  服务端为了维持半开连接状态,需要分配内核资源维护半开连接。当攻击者伪造海量的虚假 IP 向服务端发送 SYN包时,就形成了 SYN FLOOD 攻击。攻击者故意不响应ACK 消息,导致服务端被⼤量注定不能完成的半开连接占据,直到资源耗尽,停⽌响应正常的连接请求。

  直接的⽅法是提⾼ TCP 端⼝容量的同时减少半开连接的资源占⽤时间,然⽽该⽅法只是稍稍提⾼了防御能⼒;

  部署能够辨别恶意 IP 的路由器,将伪造 IP 地址的发送⽅发送的 SYN 消息过滤掉,该⽅案作⽤⼀般不是太⼤;

  上述两种⽅法虽然在⼀定程度上能够提⾼服务器的防御能⼒,但是没有从根本上解决服务器资源消耗殆尽的问题,⽽以下⼏种⽅法的出发点都是在发送⽅发送确认回复后才开始分配传输资源,从⽽避免服务器资源消耗殆尽。

  SYN Cache:该⽅法⾸先构造⼀个全局 Hash Table,⽤来缓存系统当前所有的半开连接信息。在 Hash Table 中的每个桶的容量⼤⼩是有限制的,当桶满时,会主动丢掉早来的信息。当服务端收到⼀个 SYN 消息后,会通过⼀个映射函数⽣成⼀个相应的 Key 值,使得当前半连接信息存⼊相应的桶中。当收到客户端正确的确认报⽂后,服务端才开始分配传输资源块,并将相应的半开连接信息从表中删除。和服务器传输资源相⽐,维护表的开销要⼩得多。

  SYN Cookies:该⽅案原理和 HTTP Cookies 技术类似,服务端通过特定的算法将半开连接信息编码成序列号或者时间戳,⽤作服务端给客户端的消息编号,随 SYN-ACK消息⼀同返回给连接发起⽅,这样在连接建⽴完成前服端不保存任何信息,直到发送⽅发送 ACK 确认报⽂并且服务端成功验证编码信息后,服务端才开始分配传输资源。若请求⽅是攻击者,则不会向服务端会 ACK 消息,由于未成功建⽴连接,因此服务端并没有花费任何额外的开销。

  然⽽该⽅案也存在⼀些缺点,由于服务端并不保存半开连接状态,因此也就丧失了超时重传的能⼒,这在⼀定程度上降低了正常⽤户的连接成功率。此外,客户端发送给服务端的确认报⽂存在传输丢失的可能,当 ACK 确认报⽂丢失时,服务端和客户端会对连接的成功与否产⽣歧义,此时就需要上层应⽤采取相应的策略进⾏处理了。

  SYN Proxy:在客户端和服务器之间部署⼀个代理服务器,类似于防⽕墙的作⽤。通过代理服务器与客户端进⾏建⽴连接的过程,之后代理服务器充当客户端将成功建⽴连接的客户端信息发送给服务器。这种⽅法基本不消耗服务器的资源,但是建⽴连接的时间变⻓了(总共需要 6 次握⼿)。

  在⾼并发场景下,当服务端主动关闭连接时,此时服务器上就会有⼤量的连接处于 TIME-WAIT 状态【详解⻅问题7, 8, 9】

  当客户端主动关闭连接时,我们并不需要关⼼TIME-WAIT状态过多造成的问题,但是需要关注服务端保持⼤量的CLOSE-WAIT 状态时会产⽣的问题【⻅问题 10 的解决⽅法】

  ⽆论是客户端还是服务器主动关闭连接,从本质上来说,在⾼并发场景下主要关⼼的就是服务端的资源占⽤问题,⽽这也是采⽤ TCP 传输协议必须要⾯对的问题,其问题解决的出发点也是如何处理好服务质量和资源消耗之间的关系。

  ,和传输层 TCP 相⽐,IP 协议提供⼀种⽆连接/不可靠、尽⼒⽽为的数据包传输服务,其与TCP协议(传输控制协议)⼀起构成了TCP/IP 协议族的核⼼。IP 协议主要有以下⼏个作⽤:

  :在IP 数据包中会携带源 IP 地址和⽬的IP 地址来标识该数据包的源主机和⽬的主机。IP 数据报在传输过程中,每个中间节点(IP ⽹关、路由器)只根据⽹络地址进⾏转发,如果中间节点是路由器,则路由器会根据路由表选择合适的路径。IP 协议根据路由选择协议提供的路由信息对 IP 数据报进⾏转发,直⾄抵达⽬的主机。

  :IP 数据包在传输过程中可能会经过不同的⽹络,在不同的⽹络中数据包的最⼤⻓度限制是不同的,IP 协议通过给每个 IP 数据包分配⼀个标识符以及分段与组装的相关信息,使得数据包在不同的⽹络中能够传输,被分段后的 IP 数据报可以独⽴地在⽹络中进⾏转发,在到达⽬的主机后由⽬的主机完成重组⼯作,恢复出原来的 IP 数据包。2. 域名和 IP 的关系,⼀个 IP 可以对应多个域名吗

  ;⽽⼀个 IP 却可以对应多个域名,是⼀对多的关系。(身份证号码是IP,绰号是域名。)3. IPV4 地址不够如何解决

  ,因此同⼀个 MAC 地址的设备,每次接⼊互联⽹时,得到的IP地址不⼀定是相同的,该协议使得空闲的 IP 地址可以得到充分利⽤。CIDR:

  。CIDR 消除了传统的 A 类、B 类、C 类地址以及划分⼦⽹的概念,因⽽更加有效的分配 IPv4 的地址空间,但⽆法从根本上解决地址耗尽问题。NAT:⽹络地址转换协议。我们知道属于

  地址,从⽽⼀定程度上缓解了 IP 资源枯竭的问题。然⽽主机在局域⽹中使⽤的 IP 地址是不能在公⽹中使⽤的,当局域⽹主机想要与公⽹进⾏通信时, NAT ⽅法可以将该主机 IP 地址转换成全球 IP 地址。该协议能够有效解决 IP 地址不⾜的问题。IPv6 :作为接替 IPv4 的下⼀代互联⽹协议,其可

  ,⽽这个数量级,即使是给地球上每⼀颗沙⼦都分配⼀个IP地址,该协议能够从根本上解决 IPv4 地址不够⽤的问题。

  ② 判断⽬的 IP 地址所在的⽹络是否与本路由器直接相连,如果是,则不需要经过其它路由器直接交付,否则执⾏ ③;

  ③ 检查路由表中是否有⽬的 IP 地址的特定主机路由。如果有,则按照路由表传送到下⼀跳路由器中,否则执⾏④;

  ④ 逐条检查路由表,若找到匹配路由,则按照路由表转发到下⼀跳路由器中,否则执⾏步骤 ⑤;

  ⑤ 若路由表中设置有默认路由,则按照默认路由转发到默认路由器中,否则执⾏步骤⑥;

  ,⽹络号是唯⼀的。路由器根据路由选择协议和路由表信息从⽽确定数据的转发路径,直到到达⽬的⽹络,它⼯作于⽹络层。6. ICMP 协议概念/作⽤

  ,是⼀种⽹络层协议。该协议并不传输数据,只传输控制信息来辅助⽹络层通信。其主要的功能是验证⽹络是否畅通(确认接收⽅是否成功接收到 IP 数据包)以及辅助 IP 协议实现可靠传输(若发⽣ IP 丢包,ICMP 会通知发送⽅ IP数据包被丢弃的原因,之后发送⽅会进⾏相应的处理)。7. ICMP 的应⽤

  Ping(Packet Internet Groper),即因特⽹包探测器,是⼀种⼯作在⽹络层的服务命令,主要⽤于测试⽹络连接量。本地主机通过向⽬的主机发送 ICMP Echo 请求报⽂,⽬的主机收到之后会发送 Echo 响应报⽂,Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率从⽽推断⽹络是否通常、运⾏是否正常等。

  。TraceRoute通过逐渐增⼤ TTL 值并重复发送数据报来实现其功能,⾸先,TraceRoute 会发送⼀个 TTL 为 1 的 IP 数据报到⽬的地,当路径上的第⼀个路由器收到这个数据报时,它将TTL 的值减 1,此时 TTL = 0,所以路由器会将这个数据报丢掉,并返回⼀个差错报告报⽂,之后源主机会接着发送⼀个 TTL 为 2 的数据报,并重复此过程,直到数据报能够刚好到达⽬的主机。此时 TTL = 0,因此⽬的主机要向源主机发送 ICMP 终点不可达差错报告报⽂,之后源主机便知道了到达⽬的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。8. 两台电脑连起来后 ping 不通,你觉得可能存在哪些问题?

  3. 看是否被防⽕墙阻拦(有些设置中防⽕墙会对 ICMP报⽂进⾏过滤),如果是的话,尝试关闭防⽕墙 。

  5. 两台设备间的⽹络延迟是否过⼤(例如路由设置不合理),导致 ICMP 报⽂⽆法在规定的时间内收到。

  的缩写,该协议提供根据 IP 地址获取物理地址的功能,它⼯作在第⼆层,是⼀个数据链路层协议,其在本层和物理层进⾏联系,同时向上层提供服务。当通过以太⽹发送 IP数据包时,需要先封装 32 位的 IP 地址和 48位 MAC 地址。在局域⽹中两台主机进⾏通信时需要依靠各⾃的物理地址进⾏标识,但由于发送⽅只知道⽬标 IP 地址,不知道其 MAC 地址,因此需要使⽤地址解析协议。 ARP 协议的解析过程如下:① ⾸先,每个主机都会在⾃⼰的 ARP 缓冲区中建⽴⼀个

  表,以表示IP 地址和 MAC 地址之间的对应关系;② 当源主机要发送数据时,⾸先检查 ARP 列表中是否有IP 地址对应的⽬的主机 MAC 地址,如果存在,则可以直接发送数据,否则就向同⼀⼦⽹的所有主机发送 ARP 数据包。该数据包包括的内容有源主机的 IP 地址和 MAC 地址,以及⽬的主机的 IP 地址。

  ③ 当本⽹络中的所有主机收到该 ARP 数据包时,⾸先检查数据包中的 ⽬的 主机IP 地址是否是⾃⼰的 IP 地址,如果不是,则忽略该数据包,如果是,则⾸先从数据包中取出源主机的 IP 和 MAC 地址写⼊到 ARP 列表中,如果已经存在,则覆盖,然后将⾃⼰的 MAC 地址写⼊ ARP 响应包中,告诉源主机⾃⼰是它想要找的 MAC 地址。

  ④ 源主机收到 ARP 响应包后。将⽬的主机的 IP 和 MAC地址写⼊ ARP 列表,并利⽤此信息发送数据。如果源主机⼀直没有收到 ARP 响应数据包,表示 ARP 查询失败。

  ,并且不会发⽣改变。通过静态转换,可以实现外部⽹络对内部⽹络特定设备的访问,这种⽅式原理简单,但当某⼀共有 IP 地址被占⽤时,跟这个 IP绑定的内部主机将⽆法访问 Internet。动态转换:采⽤动态转换的⽅式时,

  。当私有 IP 地址被授权访问 Internet 时会被随机转换成⼀个合法的公有 IP 地址。当 ISP 通过的合法 IP 地址数量略少于⽹络内部计算机数量时,可以采⽤这种⽅式。端⼝多路复⽤:该⽅式将外出数据包的源端⼝进⾏端⼝转换,通过端⼝多路复⽤的⽅式,

  ,从⽽最⼤限度地节约 IP 地址资源。同时,该⽅案可以隐藏内部⽹络中的主机,从⽽有效避免来⾃Internet 的攻击。11. TTL 是什么?有什么作⽤

  ,简单来说,它表示了数据包在⽹络中的时间。每经过⼀个路由器后 TTL 就减⼀,这样 TTL 最终会减为 0 ,当 TTL 为 0 时,则将数据包丢弃。通过设置 TTL 可以避免这两个路由器之间形成环导致数据包在环路上死转的情况,由于有了 TTL ,当 TTL 为 0 时,数据包就会被抛弃。12. 运输层协议和⽹络层协议的区别

  使⽤的地址,是写在⽹卡上的物理地址。MAC 地址⽤来定义⽹络设备的位置。IP 地址是

  ,是⼀种逻辑地址。IP 地址⽤来区别⽹络上的计算机。2. 为什么有了 MAC 地址还需要 IP 地址

  ,不然每⼀次路由器收到数据包时都要满世界寻找⽬的 MAC 地址。⽽我们知道 MAC 地址的⻓度为 48 位,也就是说最多总共有 2 的 48 次⽅个 MAC 地址,这就意味着每个路由器需要256 T 的内存,这显然是不现实的。和 MAC 地址不同,IP 地址是和地域相关的,在⼀个⼦⽹ 中的设备,我们给其分配的 IP 地址前缀都是⼀样的,这样路由器就能根据 IP 地址的前缀知道这个设备属于哪个⼦⽹,剩下的寻址就交给⼦⽹内部实现,从⽽⼤⼤减少了路由器所需要的内存。

  4. 私⽹地址和公⽹地址之间进⾏转换:同⼀个局域⽹内的两个私⽹地址,经过转换之后外⾯看到的⼀样吗

  时,由于⼀个私⽹ IP 地址对应⼀个公⽹地址,因此经过转换之后的公⽹ IP 地址是不同的;⽽采⽤端⼝复⽤⽅式的话,在⼀个⼦⽹中的所有地址都采⽤⼀个公⽹地址,但是使⽤的端⼝是不同的。5. 以太⽹中的 CSMA/CD 协议

  ,是像以太⽹这种⼴播⽹络采⽤的⼀种机制,我们知道在以太⽹中多台主机在同⼀个信道中进⾏数据传输,CSMA/CD 很好的解决了共享信道通信中出现的问题,它的⼯作原理主要包括两个部分:载波监听:当使⽤ CSMA/CD 协议时,总线上的

  如果有的话,表明信道处于忙碌状态,继续保持监听,直到信道空闲为⽌。如果发现信道是空闲的,就⽴即发送数据。冲突检测:当两个或两个以上节点同时监听到信道空闲,便开始发送数据,此时就会发⽣碰撞(数据的传输延迟也可能引发碰撞)。当两个帧发⽣冲突时,数据帧就会破坏⽽失去了继续传输的意义。

  。之后采⽤⼀种⼆进制退避策略让待发送数据的节点随机退避⼀段时间之后重新。

  :将⽹络层传下来的分组前后分别添加⾸部和尾部,这样就构成了帧。⾸部和尾部的⼀个重要作⽤是帧定界,也携带了⼀些必要的控制信息,对于每种数据链路层协议都规定了帧的数据部分的最⼤⻓度。

  :帧使⽤⾸部和尾部进⾏定界,如果帧的数据部分含有和⾸部和尾部相同的内容, 那么帧的开始和结束的位置就会判断错,因此需要在数据部分中出现有歧义的内容前边插⼊转义字符,如果数据部分出现转义字符,则在该转义字符前再加⼀个转义字符。在接收端进⾏处理之后可以还原出原始数据。这个过程透明传输的内容是转义字符,⽤户察觉不到转义字符的存在。差错检测:⽬前数据链路层⼴泛使⽤循环冗余检验

  点对点协议为点对点连接上传输多协议数据包提供了⼀个标准⽅法。该协议设计的⽬的 主要是⽤来通过拨号或专线⽅式建⽴点对点连接发送数据,使其成为各种主机、⽹桥和路由器之间简单连接的⼀种解决⽅案。PPP 协议具有以下特点:

  的能⼒,其允许在连接时刻协商 IP 地址。PPP ⽀持多种⽹络协议,例如 TCP/IP、NETBEUI等。

  IETF 在设计因特⽹体系结构时把⻬总最复杂的部分放在 TCP 协议中,⽽⽹际协议 IP 则相对⽐较简单,它提供的是不可靠的数据包服务,在这种情况下,数据链路层没有必要提供⽐ IP 协议更多的功能。若使⽤能够实现可靠传输的数据链路层协议,则开销就要增⼤,这在数据链路层出现差错概率不⼤时是得不偿失的。

  即使数据链路层实现了可靠传输,但其也不能保证⽹络层的传输也是可靠的,当数据帧在路由器中从数据链路层上升到⽹络层后,仍有可能因为⽹络层拥塞⽽被丢弃。

  PPP 协议在帧格式中有帧检验序列,对每⼀个收到的帧,PPP 都会进⾏差错检测,若发现差错,则丢弃该帧。

  。物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据⽐特流,其尽可能地屏蔽掉不同种类传输媒体和通信⼿段的差异,使物理层上⾯的数据链路层感觉不到这些差异,这样就可以使数据链路层只考虑完成本层的协议和服务,⽽不必考虑⽹络的具体传输媒体和通信⼿段是什么。2. 主机之间的通信⽅式

  :也叫单向通信,发送⽅和接收⽅是固定的,消息只能单向传输。例如采集⽓象数据、家庭电费,⽹费等数据收集系统,或者打印机等应⽤主要采⽤单⼯通信。

  :也叫双向交替通信,通信双⽅都可以发送消息,但同⼀时刻同⼀信道只允许单⽅向发送数据。例如传统的对讲机使⽤的就是半双⼯通信。

  :也叫双向同时通信,全双⼯通信允许通信双⽅同时在两个⽅向是传输,其要求通信双⽅都具有独⽴的发送和接收数据的能⼒。例如平时我们打电话,⾃⼰说话的同时也能听到对⾯的声⾳。3. 通道复⽤技术

  频分复⽤(FDM,Frequency Division Multiplexing)频分复⽤将传输信道的总带宽按频率划分为若⼲个⼦频带或⼦信道,每个⼦信道传输⼀路信号。⽤户分到⼀定的频带后,在数据传输的过程中⾃始⾄终地占⽤这个频带。由于每个⽤户所分到的频带不同,使得传输信道在同⼀时刻能够⽀持不同⽤户进⾏数据传输,从⽽实现复⽤。除了传统意义上的 FDM 外,⽬前正交频分复⽤(OFDM)已在⾼速通信系统中得到⼴泛应⽤。

  时分复⽤(TDM,Time Division Multiplexing) 顾名思义,时分复⽤将信道传输信息的时间划分为若⼲个时间⽚,每⼀个时分复⽤的⽤户在每⼀个 TDM 帧中占⽤固定时隙进⾏数据传输。⽤户所分配到的时隙是固定的,所以时分复⽤有时也叫做同步时分复⽤。这种分配⽅式能够便于调节控制,但是也存在缺点,当某个信道空闲时,其他繁忙的信道⽆法占⽤该空闲信道,因此会降低信道利⽤ 率。

  波分复⽤(WDM,Wavelength Division Multiplexing)在光通信领域通常按照波⻓⽽不是频率来命名,因为光的频率和波⻓具有单⼀对应关系,因此 WDM 本质上也是FDM,光通信系统中,通常由光来运载信号进⾏传输,WDM 是在⼀条光纤上传输多个波⻓光信号,其将 1 根光纤看做多条「虚拟」光纤,每条「虚拟」光纤⼯作在不同的波⻓上,从⽽极⼤地提⾼了光纤的传输容量。码分复⽤(CDM,Code Division Multiplexing)

  码分复⽤是靠不同的编码来区分各路原始信号的⼀种复⽤⽅式,不同的⽤户使⽤相互正交的码字携带信息。由于码组相互正交,因此接收⽅能够有效区分不同的⽤户数据,从⽽实现每⼀个⽤户可以在同样的时间在同样的频带进⾏数据传 输,频谱资源利⽤率⾼。其主要和各种多址接⼊技术相结合从⽽产⽣各种接⼊技术,包括⽆线. ⼏种常⽤的宽带接⼊技术

  我们⼀般将速率超过 1 Mbps 的接⼊称为宽带接。

相关推荐
  • 首页![天美娱乐]!首页
  • 首页“中华会娱乐”主页
  • 优游娱乐-指定注册
  • 主页万博娱乐主页
  • 首页.万和城平台.首页
  • 首页。(星球注册)。首页
  • 聚星-聚星平台-「联盟认证注册」
  • 万向注册-指定注册
  • 大摩_大摩注册-【首选注册登录平台】
  • 首页·BET365娱乐挂机·首页
  • 脚注信息
    友情链接: