网络相关知识复习

复习下网络相关知识,包括TCP/IP协议族题解结构和主要协议介绍、封装、复用、ARP协议、IP协议、TCP协议、IP模块工作流程、TCP网络连接的建立和状态转移、DNS服务、HTTP服务的介绍。

浏览器网页访问的过程简介

  1. 浏览器分析链接指向的URL
  2. 浏览器向DNS请求解析域名的IP地址(DNS协议基于UDP协议)
    1. UDP(用户数据报)协议 不可靠、无连接、基于数据报
    2. IP协议 不可靠(不保证IP数据报准确到达接收端)、无连接、无状态(简单、高效)
    3. 封装 DNS报文 + UDP头部 -> UDP数据报 + IP头部 -> IP数据报 + 以太网头部 + 以太网尾部 -> 以太网帧
    4. 传输
      1. 传输层端对端
      2. 网络层 选路和转发 使用IP地址寻址
      3. 数据链路层 网络驱动程序 使用物理地址寻址 (ARP协议 IP地址转为物理地址) (RARP协议 物理地址转化为IP地址)
      4. 分片:帧的最大传输单元(MTU),受到网络类型的限制,以太网帧的MTU1500字节,过长的IP数据报可能会被分片传输.分片只有在最终目标机器上才会被内核IP模块重新组装.
    5. 分用 以太网帧到目的主机后,根据各层协议头,将报文逐层解析,最终将处理后的数据交给目标应用程序
  3. DNS获取域名的IP地址,并返回解析到的IP地址
    1. 递归查询(一般采用方式) 主机 -> 本地域名服务器 -> 根域名服务器 -> 本地域名服务器 -> 顶级域名服务器 -> 本地域名服务器 -> 权限域名服务器 -> 本地域名服务器 -> 主机
    2. 迭代查询 主机 -> 本地域名服务器 -> 根域名服务器 -> 顶级域名服务器 -> 权限域名服务器 -> 顶级域名服务器 -> 根域名服务器 -> 本地域名服务器 -> 主机
  4. 浏览器和服务器建立TCP链接(TCP三次握手)
    1. TCP(传输控制)协议 可靠(发送应答机制,超时重传机制,乱序/重复IP报文重排/整理机制)、面向连接(保存状态占用内核资源,全双工)、基于流(数据的发送和接收没有边界限制)
    2. 浏览器(CLOSED->SYN_SENT)发送SYN到服务器
    3. 服务器(LISTEN->SYN_RECV)接收SYN并发送SYN和ACK到浏览器
    4. 浏览器(SYN_SENT->ESTABLISHED)接收ACK并发送ACK到服务器(SYN_RECV->ESTABLISHED)
  5. 浏览器发出命令
    1. HTTP协议 无连接,无状态
    2. 封装
    3. 传输
      1. 拥塞窗口
      2. 慢开始
      3. 拥塞避免
      4. 慢开始门限(拥塞窗口)
      5. 快重传
      6. 快恢复
      7. 发送窗口(拥塞窗口和对方给出接收窗口中较小的那一个)
      8. 路由器的尾部丢弃和随机丢弃策略
      9. 糊涂窗口综合症
      10. 滑动窗口
    4. 分用
  6. 服务器给出响应
  7. 浏览器关闭释放TCP连接(TCP四次挥手)
    1. 浏览器(ESTABLISHED->FIN_WAIT_1)发送FIN到服务器
    2. 服务器(ESTABLISHED->CLOSE_WAIT)接收FIN并发送ACK到浏览器,浏览器(FIN_WAIT_1->FIN_WAIT_2)接收ACK
    3. 服务器(CLOSE_WAIT->LAST_ACK)发送FIN到浏览器
    4. 浏览器(FIN_WAIT_2->TIME_WAIT)接收FIN,并发送ACK到服务器,服务器(LAST_ACK->CLOSED)接收ACK 先关闭链接的一方进入TIME_WAIT状态,TIME_WAIT状态需要等待2MSL(TCP报文段最大生存时间):
      1. 可靠的终止链接(重发ACK)
      2. 保证让迟来的TCP报文段有足够时间被识别并丢弃
  8. 浏览器显示返回结果

TCP/IP协议族

Internet(因特网)主流协议族是TCP/IP协议族。
TCP/IP协议族是一个多层、多协议的通信协议。

TCP/IP协议族体系结构和主要结构

TCP/IP协议是四层协议系统,从底到上分别是数据链路层、传输层、网络层、应用层
每层完成不同的功能,通过若干协议来实现,上层协议使用下层协议提供的服务
TCP/IP协议族体系结构和主要结构

网络链路层

网络链路层实现网卡接口的网络驱动程序,处理数据在物理媒介(比如以太网、令牌环等)上的传输。不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供了一个统一的接口。
数据链路层主要协议:

  1. ARP协议(地址解析协议) 将IP地址转换为物理地址(通常为MAC地址,以太网、令牌环、802.11无线网络都是用MAC地址)。
  2. RARP协议(逆地址解析协议) 将物理地址转化为IP地址,利用网卡上的物理地址向网络管理者(服务器或网络管理软件)查询自身的IP地址,RARP协议仅用于网络上的某些无盘工作站,无盘工作站缺乏存储设备,所以无法记住自身的地址。运行RARP服务的网络管理者通常存有该网路上所有及其的物理地址到IP地址的映射。

数据链路层使用物理地址来寻址一台机器,而网络层使用IP地址寻找一台机器。

网络层

网络层实现数据包的选路和转发。WAN(广域网)通常使用众多分级的路由器来连接分散的主机或LAN(局域网),因此,通信的两台主机一般不是直接相连的,而是通过多个中间节点(路由器)相连,网络层的任务就是选择这些中间节点,以确认主机之间的通信路径
网络层对上层协议隐藏网络拓扑连接的细节,使得在传输层和网络应用程序看来,通信的双方是直接相连的。

网络层核心协议:IP协议(因特网协议)
IP协议通过数据包的目的IP地址来决定如何投递它。如果数据包不能直接发送给目的主机,那么IP协议就为它寻找一个和合适的下一跳路由器,并将数据包交付给该路由器来转发。多次重复该过程,数据包最终到达目标主机,或者因为发送失败而被丢弃。
IP协议使用逐跳的方式确定通信路径。
网络层重要协议ICMP协议(因特网控制报文协议),IP协议的重要补充,主要用来检测网络连接

ICMP协议并不是严格意义上的网络层协议,因为它使用处于同一层的IP协议提供的服务。
ICMP报文格式
8位类型,用来区分报文类型

  1. 差错报文,主要用来回应网络错误,比如目标不可达(类型值为3)和重定向(类型值为5)。
  2. 查询报文,主要用来查询网络信息,比如ping程序使用ICMP报文查看目标是否可达(类型值为8)。

8位代码,进一步区分不同的条件,比如重定向报文使用代码值0表示对网络重定向,用代码值1标识对主机重定向。
16位校验和,对整个报文(包括头部和内容部分)进行循环冗余检验(CRC),以检验报文在传输过程中是否损坏,不同的ICMP报文类型具有不同的正文内容。

传输层

传输层为两台主机上的应用程序提供端到端的通信,传输层只关心通信的起始端和目的端,而不关心数据包的中转过程
传输层协议主要有三个:TCP协议,UDP协议和SCTP协议

  1. TCP协议(传输控制协议)为应用层提供可靠的、面向连接的和基于流的服务。
  2. UDP协议(用户数据报协议)为应用层提供不可靠的、无连接的和基于数据报的服务。
  3. SCTP协议(流控制传输协议)相对较新的传输层协议,为了在因特网上传输电话信号而设计。
    传输层和网络层的区别
    图中垂直实线箭头表示TCP/IP协议族之间的实体通信(数据包确实沿着这些线路传递),水平虚线箭头表示逻辑通信线路。
    数据链路层(驱动程序)封装了物理网路的电气细节;网络层封装了网络连接的细节;传输层为应用程序封装了一条端到端的逻辑通信链路,负责数据的收发、链路的超时重连等。

应用层

应用层负责处理应用程序的逻辑。数据链路层、网络层、传输层负责处理网络通信细节,这些部分必须既稳定又高效,因此它们都在内核空间中实现。应用层在用户空间实现,因为它处理众多逻辑,比如文件传输、名称查询、网络管理等。如果应用层实现在内核中,内核会变得非常庞大。应用层实现在内核中,内存不用在用户空间和内核空间中来回切换(主要是数据复制),可以提高工作效率,但实现复杂、不够灵活、不方便移植。
应用层协议众多:

  1. ping是应用程序,而是不协议,利用ICMP报文检测网络连接,是调试网络环境的必备工具。
  2. telent协议是一种远程登陆协议,使我们能在本地完成远程任务。
  3. OSPF(开放最短路径优先)协议是一种动态路由更新协议,用于路由器之间通信,以告知对方各自的路由信息。
  4. DNS(域名服务)协议提供及其域名到IP地址的转换

应用层协议(或程序)可以跳过传输层直接使用网络层提供的服务,比如ping程序和OSPF协议。
应用层协议(或程序)通常既可以使用TCP服务,又可以使用UDP协议,比如DNS协议。

封装

应用程序数据在发送到物理网络上之前,先沿着协议栈从上向下传递,每层协议都在上层数据的基础上加上自己的头部信息(有时还包括尾部信息),以实现该层的功能,这个过程叫做封装
封装
经过TCP封装获得数据成为TCP报文段(TCP段)。
TCP协议为通信双方维持一个连接,并且在内核中存储相关数据。当发送端应用程序使用send(或者write)函数向一个TCP连接写入数据时,内核中TCP模块首先将这些数据复制到与该连接相对应的TCP内核发送缓存区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP内核缓存区(发送缓存区或接收缓存区)数据一起构成TCP报文段
TCP报文段封装过程
经过UDP封装后的数据称为UDP数据报。UDP对应用程序数据的封装与TCP类似。UDP无须为应用层数据保存副本,提供不可靠的服务。当一个UDP数据报被成功发送后,UDP内核缓存区中的该数据报就被丢弃了。如果应用程序检测到该数据报未被接收端正确接收,并打算重发这个数据报,则应用程序需要重新从用户空间将该数据报拷贝到UDP内核发送缓存区。
经过IP封装后的数据称为IP数据报,IP数据报也包括头部信息和数据部分,其中数据部分就是一个TCP报文段、UDP数据报或着ICMP报文。
经过数据链路层封装的数据成为,传输媒介不同,帧的类型也不同。比如,以太网上是以太网帧,令牌环网络为令牌环帧。
以太网帧如下图所示:
以太网帧
以太网帧使用6字节的目的物理地址和6字节的源物理地址来表示通信的双方。
2字节类型字段用来标识上层协议。
4字节CRC字段对帧的其他部分提供循环冗余教研。
帧的最大传输单元(MTU),集帧最多携带多少上层协议数据,通常受到网络类型的限制,以太网帧的MTU是1500字节,过长的IP数据报可能需要被分片传输。
帧才是最终在物理网络上传输的字节序列

分用

当帧到达目的主机后,将沿着协议栈自底向上依次传递,各层协议以此处理帧中本层负责的头部信息获取所需的信息,并最终将处理后的数据交给目标应用程序,这个过程叫做分用。
以太网分用过程
分用是依靠头部信息中的类型字段来实现的。
帧中用2字节类型字段区分上层协议,即IP协议、ARP协议或RARP协议。
类型字段为0x800,即帧的数据部分为IP数据报。
类型字段为0x806,即帧的数据部分为ARP请求或应答报文。
类型字段为0x835,即帧的数据部分为RARP请求或应答报文。
IP数据报的头部采用16位的协议字段来区分ICMP协议、TCP协议和UDP协议。
TCP报文段和UDP报文段则通过其头部中的16位端口号字段来区分上层应用程序。

ARP协议

ARP协议实现任意网络层地址到物理层地址的转换
IP地址到以太网地址(MAC)的转换。
工作原理:主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。此网络上的其他机器都将收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址。
以太网ARP请求或应答报文
硬件类型:定义物理地址的类型,值为1表示MAC地址。
协议类型:表示要映射的协议地址类型,值为0x800表示IP地址。
硬件地址长度和协议地址长度:单位为字节。MAC地址长度为6,IP(v4)地址长度为4。
操作类型:4种操作类型。ARP请求(1)、ARP应答(2)、RARP请求(3)、RARP应答(4)。
最后四个字段指定通信双方的以太网地址(MAC)和IP地址。
发送端填充除了目的端以太网地址之外的其他3个字段,以构建ARP请求并发送。
接收端发送请求的目的端IP地址是自己,就把自己的以太网地址填充进取,然后交换两个目的端地址和两个发送端地址,以构建ARP应答并返回。
ARP请求/应答报文长度为28字节,加上以太网头部和尾部的18字节,一个携带ARP请求/应答的以太网帧帧长度为46字节,有的实现要求以太网数据长度至少为46字节,此时ARP请求/应答报文会增加一些填充字节,满足该要求,这样携带ARP请求/应答报文的以太网帧为64字节。
ARP维护一个高速缓存,其中包含经常访问(比如网关地址)或最近访问的机器的IP地址到物理地址的映射。避免了重复的ARP请求,提高了发送数据报的速度。ARP高速缓存是动态变化的。
每个ARP广播中都包含发送方的IP地址到物理地址的绑定,接收方在处理ARP分组前,先更新缓存中IP到物理地址的绑定信息
ARP通信过程

IP协议

IP协议是TCP/IP协议的动力,为上层提供无状态、无连接、不可靠的服务
无状态:IP通信双方不同步传输数据的状态信息。 优点:简单、高效
无连接:IP通信双方不长久地维持双方的任何信息。上层协议每次发送数据的时候,都必须明确制定对方的IP地址。
不可靠:Ip协议不保证IP数据报准确地到达接收端
IP报文

选项:

  1. 记录路由,告诉数据报途径的所有路由器都将自己的IP地址填入IP头部的选项部分,用于跟踪数据报的传递路径。
  2. 时间戳,告诉每个路由器都将数据报转发的时间填入IP头部的选项部分,测量途径路由之间的数据报传输时间。
  3. 松散源路由选择,指定一个路由器IP地址列表,数据报发送过程中必须经过所有的路由器。
  4. 严格源路由选择,和松散源路由选择类似,不过数据报只能经过被指定的路由器。

当IP数据报的长度超过帧的MTU时,将被分片传输。分片可以发送在发送端,也可以发生在中转路由器上,而且在传输过程中可能被多次分片,但只有在最终的目的机器上,这些分片才会被内核中IP模块重新组装。
IP头部中的数据报标识、标志和片偏移三个字段给IP的分片和组装提供了足够的信息,一个IP数据报的每个分片都具有自己的IP头部,具有相同的标识符,但具有不同的片偏移。并且除了最后一个分片外,每个分片都将设置MF标志,每个分片的IP头部的总长度字段将被设置为该分片的长度。
IP头部信息结构体格式

IP模块工作流程


IP输出队列中存放的是所有等待发送的IP数据报,其中除了需要转发的IP数据报外,还包括本机上层数据(ICMP报文、TCP报文段和UDP报文段)的IP数据报。
从IP输入队列中取出一个IP数据报:

  1. 对该IP数据报的头部做CRC校验,确认无误后分析其头部的具体信息。
  2. 如果该IP数据报的头部设置了源站选路选项(松散源路由选择或严格源路由选择),则IP模块调用数据报转发子模块来处理该数据报。
  3. 如果该IP数据报的头部中目标IP地址是本机的某个IP地址或者广播地址,即该数据报是发送给本机的,则IP模块根据数据报头部的协议字段来句町将它分派给那个上层应用(分用)。否则该数据报不是发送给本机的,将其交给转发子模块来处理。
  4. 数据报转发子模块将首先检测系统是否允许转发,如果不允许,IP模块就丢弃该数据报。如果允许,数据报转发子模块就对该数据报执行一些操作,然后将其交给IP数据报输出子模块。

IP数据报应该发送至下一跳路由(或者目标机器),以及经过哪个网卡来发送,就是IP路由过程
IP模块实现数据报路由的核心数据结构是路由表,这个表按照数据报的目标IP分类,同一类型的IP数据报就被发往相同的下一跳路由器(或目标机器)。
虚线箭头显示路由表更新的过程,这一过程是指通过路由协议或者route命令调整路由表,使之更适应最新的网络拓扑结构,成为IP路由测策略。

1
2
3
4
5
6
[CaseZheng@localhost Picture]$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 enp2s0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 enp2s0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0

IP路由机制:

  1. 查找路由表中和数据报中的目的IP地址完全匹配的主机IP地址,如果找到,就是用该路由项,没找到则转步骤2。
  2. 查找路由表中和数据报中目标IP地址具有相同网路ID的网络IP地址。如果找到,就是用该路由项,没找到则转步骤3。
  3. 选择默认路由,通常表示网关。

路由器更新:
路由器必须能够更新,以反映网络连接的变化,这样IP模块才能准确、高效地转发数据报。

  1. 通过route命令或者其他工具手动修改路由表,是静态的路由更新方式。
  2. 对大型路由器,通过BGP(边际网关协议)、RIP(路由信息协议)、OSFP等协议来发现路径,并更新自己的路由表。这种方式是动态的、自动的。
  3. ICMP重定向报文。

IP转发:

  1. 检测数据报头部的TTL值,如果TTL值已经为0,则丢弃该数据报。
  2. 查看数据报头部的严格源路由选择选项,如果该选项被设置,则检测数据报的目标IP地址是否是本机的某个IP地址,如果不是,则发送一个ICMP源站路由失败报文给发送端。
  3. 如果有必要,则给源端发送一个ICMP重定向报文,告诉它一个更合理的下一跳路由器。
  4. 将TTL值减1。
  5. 处理IP头部选项。
  6. 如果有必要,则执行IP分片。

一般来说,主机只接收ICMP重定向报文,路由器只能发送ICMP重定向报文。
ICMP重定向报文的类型值为5,代码字段有4个可选值,用来区分不同的重定向类型。
主机重定向代码值为1。
更新路由表通常是更新路由表缓存,而不是直接更改路由表。

TCP协议

TCP服务:面向连接、字节流和可靠传输
面向连接:使用TCP通信的双方必须先建立连接,然后才可以开始数据的读写。双方必须为该连接分配必要的内核资源,以管理连接的状态和连接上的传输。TCP连接是全双工的,即双方的数据读写可以通过一个连接进行,完成数据交换后,通信双方必须断开连接以释放系统资源。TCP连接是一对一的,所以基于广播和多播的应用程序不能使用TCP连接。而无连接协议UDP协议则非常适合于广播和多播。
字节流:发送端执行的写操作次数和接收端执行的读操作次数没有任何数量关系,应用程序对数据的发送和接受没有边界限制
可靠连接:

  1. 发送应答机制,发送端发送的每个TCP报文段都必须得到接收方的应答,才认为这个TCP报文段传输成功。
  2. 超时重传机制,发送端在发送一个TCP报文后启动定时器,如果定时器时间内未收到应答,将重新发送该报文段。
  3. TCP报文段最终以IP数据报发送,而IP数据报到达接收端可能是乱序、重复的,所以TCP协议会对接收到的IP报文重排、整理,再交给应用层。

由于TCP使用两个端点来标识连接,一个机器上的某个TCP端口可以被多个连接所共享。

TCP头部结构如下图所示

16位端口号,告知主机该数据报来自哪个(源端口)以及传给哪个上层协议或应用程序(目的端口)的。进行TCP通信时,客户端使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。
32位序列号,一次TCP通信(从TCP连接建立到断开)过程中某个传输方向上的字节流的每个字节的编号。
32位确认号,对于另一方发送来的TCP报文段的响应,其值是收到的TCP报文段的序号家1。
4位头部长度,表示该TCP头部有多少个32bit(4字节)。
6位标志位:

  1. URG,紧急指针是否有效。
  2. ACK,表示确认号是否有效,携带ACK标志的TCP报文段为确认报文段。
  3. PSH,提示接收端应用程序应该立即从TCP接收缓存区读走数据,为后续数据腾出空间。
  4. RST,要求对方重新建立连接,携带RST标志的TCP报文段位复位报文段。
  5. SYN,要求建立一个连接,携带SYN标志的TCP报文段位同步报文段。
  6. FIN,通知对方本端要关闭了,携带FIN标志的TCP的报文段为结束报文段。

16位窗口大小,是TCP流量控制的一个手段,指接收通告窗口,告诉对方本端的TCP接收缓存区还能容纳多少字节的数据,对方据此控制发送数据的速度。
16位校验和,由发送端填充,接收端对TCP报文段执行CRC算法以校验TCP报文段在传输过程中是否损坏,注意:检验包括头部和数据部分。是TCP可靠传输的一个保障。
16位紧急指针,一个正的偏移量,它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。该字段,实际是紧急指针相对当前序号的偏移,紧急偏移。TCP的紧急指针的发送端向接收端发送紧急数据的方法。
紧急指针指出紧急数据在报文段中的结束位置。


TCP头部的最后一个字段选项是可变长的可选信息,最多包含40个字节。
kind说明选项类型,常见的TCP选项有7种。
length说明该选项的长度。
info是选项的具体信息。

kind=0,选项表结束选项。
kind=1,空操作选项,没有特殊含义,一般用于将TCP选项的长度填充为4字节的整数倍。
kind=2,最大报文段长度选项。
kind=3,窗口扩大引子选项。
kind=4,选择性确认(SACK)选项。
kind=5,SACK实际工作的选项。
kind=8,时间戳选项。

TCP报文段伪首部,用于TCP校验和计算。

TCP确认信息指出了接收方期望收到的下一个报文组的序号。
拥塞窗口:拥塞窗口发送方使用,用来控制发送速率,避免发的过多.
慢开始:在启动新连接的传输或者在拥塞之后增加通信量时,仅以一个报文段作为拥塞窗口的初始值,而每收到一个确认后,将拥塞窗口大小加1,使用慢开始算法后,每经过一个往返时间RTT,拥塞窗口的值就加倍。
拥塞避免算法:让拥塞窗口缓慢增加,每经过一个往返时间RTT就把发送窗口的拥塞窗口加1,而不是加倍。
慢开始门限

  1. 拥塞窗口小于慢开始门限,使用慢开始算法。
  2. 拥塞窗口大于慢开始门限,使用拥塞避免算法。
  3. 拥塞窗口等于慢开始门限,即可使用慢开始算法,也可使用拥塞避免算法。
    滑动窗口:控制接收和同步数据,通知接收方目前接收的数据范围,用于流量控制,接收端使用.
    快重传:接收方每收到一个失序的报文段就立即发出重复确认,而不是等待自己发送数据时才进行捎带确认。当发送方一次收到3个重复确认就应立即重传对方尚未收到的报文段。
    快恢复:当发送方连续收到三个重复确认时,就执行“乘法减小算法”,把快启动门限减半,把拥塞窗口设置为慢开始门限减半后的数值,然后开始执行拥塞避免算法。
    发送方的发送窗口一定不能超过对方给出的接收窗口值。发送窗口的取值为拥塞窗口和对方给出的接收窗口中较小的那一个
    路由器的尾部丢弃策略:如果数据报到达时输入队列已被填满,则丢弃该数据报。
    可能会丢弃来自多个TCP连接的一个数据报,而不是来自一个连接的多个数据报,造成全局性的同步,丢失数据报的多个TCP连接同时进入慢开始状态。
    路由器的随机丢弃策略(RED):当数据报到达时,如果输入队列已满,则丢弃这个数据报,如果输入队列未满,但大小超过了上限阀值,则通过按概率p丢弃数据报来避免同步。
    糊涂窗口综合症:发送方应用进程产生数据很慢或者接收端应用程序处理接收缓冲区数据很慢,或者二者皆有;就会导致应用进程间传送的报文很小;极端情况下,有效载荷可能只有1个字节,传输开销有40个字节(20个字节的IP头和20字节的TCP头)这种现象。
    接收方避免糊涂窗口综合症的策略:通告0窗口后,要等缓冲区可用空间至少达到宗空间的一半或达到最大报文段长度后才发送更新的窗口通告。
    实现接收方避免糊涂窗口综合症的策略可使用两种手段:
  4. TCP对收到的报文段进行确认,但要等到窗口空间达到启发式策略所指定的限度之后才发出窗口增大的通告。
  5. 在窗口大小不足以避免该症的策略所指定的限度时,则延迟发送确认。TCP标准推荐延迟发送确认。
    1. 延迟确认技术优点:降低通信量并提高吞吐量
    2. 延迟确认技术缺点:当接收方的确认延迟太大时,发送方会进行报文段的重传(浪费网络宽带,降低了吞吐量,加重了收发双方的计算负载)。推迟确认造成了估算值的混乱并增大了重传时间。TCP实现确认推迟时间最多推迟500ms,TCP标准推荐接收方按照至少每隔一个报文段使用正常的方式对报文段进行确认。
      发送方避免糊涂窗口综合症的策略:在一个连接上已经传输的数据还未收到确认的情况下,发送方的应用程序又生成了后续数据,并照常将数据送到输出缓冲区中,但这时并不发送后续报文段,而是等数据足以填满一个达最大长度的报文段之后再把缓冲区的数据发送出去,该策略适用于任何情况,包括推操作在内。
      现行的TCP要求收发双方实现避免糊涂窗口综合症的启发式策略。接收方要避免小窗口通告,而接收方要使用自适应机制来推迟传送,以便将数据组块形成较长的大报文段

TCP网络连接

TCP通信双方建立TCP连接的一般过程。如下图:

TCP通信双方的各种状态变化如下图所示:

DNS协议

DNS是一套分布式的域名服务系统,每个DNS服务器上都存放着大量的机器名和IP地址的映射,并且时动态更新的。众多网络客户端程序使用DNS协议来向服务器查询目标主机的IP地址。
DNS报文格式如下:

16位标识:用来标记一对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的回应。
16位标志:用来协商具体的通信方式和反馈通信状态

16位问题个数、16位应答资源记录个数、16位授权资源记录数目和16位额外的资源记录数目分别指出DNS报文的最后四个字段的资源记录数目。
对查询报文,一般包含一个查询问题,而应答资源记录数、授权资源记录数和额外资源记录数则为0。
对应答报文,应答资源记录数则至少为1,而授权资源记录数和额外资源记录数可为0或非0。

HTTP协议

HTTP协议

HTTPS是以安全为目标的HTTP通道,是HTTP的安全版本,即HTTP+SSL层,HTTPS的安全基础是SSL.
HTTPS协议的主要作用:

  1. 建立一个信息安全通道,确保数据传输安全
  2. 确保网站真实性

HTTP以明文方式发送内容,不提供任何方式的数据加密

HTTP和HTTPS区别

  1. HTTP是明文传输,HTTPS具有安全性的SSL加密传输协议
  2. HTTPS需要CA申请证书,免费证书少,需要一定费用,HTTP则不需要
  3. HTTP和HTTPS使用完全不同的连接方式,HTTP默认80端口,HTTPS默认443端口
  4. HTTP连接无状态,HTTPS协议由HTTP+SSL协议构建,可进行加密传输、身份认证的网络协议,安全性高于HTTP

HTTPS优缺点

  1. 优点:
    1. 使用HTTPS协议认证用户的服务器,确保数据发送到正确的客户机和服务器
    2. HTTPS有SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的安全和完整.
  2. 缺点:
    1. HTTPS握手阶段耗时多
    2. SSL证书需要钱
    3. HTTPS的协议加密范围有限,

面试问题

TCP三次握手,客户端发送的最后确认的ACK丢失,服务端会怎么样? 服务器在没有收到第二个ACK时,客户端发送数据,被服务端接收到,服务端怎么处理? 客户端在回复ACK的同时携带数据服务器会怎么处理?

  1. TCP三次握手,如果第2个ACK丢失,此时服务端状态为SYN_RECV,等段时间后会触发超时重传,依次等待时间为3s,6s,12s,24s,48s,之后重发SYN+ACK包(服务端重发SYN+ACK包的次数可通过/proc/sys/net/ipv4/tcp_synack_retries修改,默认为5次),让客户端重发ACK.如果重发指定次数的SYN+ACK后仍然未收到ACK应答,过一段时间,Server将自动关闭这个连接.
  2. 虽然第二个ACK丢失,但客户端在发出ACK后即确认连接建立,此时发送数据到服务端,服务端将发送RST,让客户端断开这个异常连接.
  3. 客户端在第二个ACK携带数据,服务端会正常建立连接,并处理数据

主动关闭TCP连接的一方进入TIME_WAIT状态,还是被动关闭的一方进入?TIME_WAIT状态有何特殊之处,为什么?

  1. 主动关闭的一方进入TIME_WAIT状态
  2. TIME_WAIT状态需要等待2MSL(TCP报文段最大生存时间),才会完全关闭
    1. 可靠地终止TCP连接,当被动关闭的一方发出FIN,在等待一段时间后未收到ACK,此时会重发FIN,令主动关闭的一方重发ACK.
    2. 保证来迟的TCP报文段有足够的时间被识别并丢弃

关闭TCP连接时,如果通信双方同时发出了FIN会怎么样?

  • 同时发出FIN则都先进入FIN_WAIT_1状态,在收到对方的FIN后进入CLOSING状态,并发出自己的ACK,等收到对方的ACK后,再进入TIME_WAIT状态

被动关闭一方在LAST_ACK收不到ACK如何关闭?

如果超时未收到ACK则会重发FIN,此时:

  1. 主动关闭一方仍处于TIME_WAIT状态,则会发送ACK,被动关闭方收到ACK则顺利从LAST_ACK进入CLOSED.
  2. 主动断开的一方经过2MSL已经进入了CLOSED状态,此时会返回RST给被动关闭方,被断开方收到后从LAST_ACK进入CLOSED.

四次挥手可能变成三次挥手吗?

  • 当被动关闭方在收到FIN后,回复ACK的时候,可能由于TCP延迟确认,延迟发送这个ACK,此时被动关闭一方也关闭了连接,被动关闭一方将同时发送FIN和ACK给主动关闭一方,被动关闭方由CLOSE_WAIT状态直接到LAST_ACK状态,而主动关闭一方由FIN_WAIT_1状态直接进入TIME_WAIT状态.此时TCP四次挥手,变为三次挥手

四次挥手,被动关闭一方何时发送FIN?

  • 被动关闭一方收到FIN并回复ACK后不会理解发送FIN,需要等待应用层关闭连接后才会发送FIN

为什么是三次握手,四次挥手?

  1. 三次握手,为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误. 例如:客户端发送一个连接请求给服务端,这个请求并没有丢失,但由于未知原因在某个网络节点,导致延迟到连接释放的某个时间点到达服务端,这是一个本已失效的报文段,但服务端再收到报文后,会误以为A再次发出了一个新的连接请求,服务端向客户端发送确认报文,确认连接成功,但客户端并没有发出建立连接的请求,服务端等不到客户端的消息,也不会结束连接,白白浪费服务器资源
  2. 四次挥手是因为TCP连接是全双工的,允许同时通信的双方同时进行数据的收发,也运行收发的两个方向的连接被独立关闭,避免客户端数据发送完毕,向服务端发送FIN关闭连接,而服务端还有发送到客户端的数据没有发送完毕的情况.所以关闭TCP连接需要四次,每次关闭一个方向上的连接需要FIN和ACK两次.

什么是半打开、半关闭、半连接?

  1. 半打开,一方已经关闭或者异常终止连接,而另一方却不知道,这样的连接称为半打开
  2. 半关闭,TCP是全双工的,其在关闭写后,仍然可以读取对方发送的数据称为半关闭
  3. 半连接,客户端向服务端发起TCP连接发送SYN,服务端正常回复SYN和ACK,但客户端未回复ACK

close和shutdown的区别

  • 单进程、单线程、多线程在使用close时行为是一致的,都会真正的关闭连接,而多进程下调用close函数只是对其引用计数减一,只有当引用计数为0时才会真正的关闭连接,如果多进程共享同一个socket则需要都调用close才会真正关闭连接
  • shutdown则和多进程、多线程无关,只要调用shutdown都会去真正的关闭连接.shutdown可以通过标志位选择关闭读(对端发送过来的消息丢弃掉)、关闭写(发送FIN)、关闭读写

listen函数的第二个参数的含义是什么?

  • TCP在三次握手时,服务端维护了两个队列,一个是连接尚未建立完成的队列(SYN队列,即收到SYN,回复SYN+ACK后,尚未收到ACK),一个是连接建立完成的队列(ACCEPT队列,即收到SYN,回复SYN+ACK后,收到ACK),listen函数第二个参数的含义即为连接建立完成的队列的长度,一般设置为5-10,因为服务器处理能力优先,而且维护队列需要消耗资源

TCP的定时器有哪些?

  1. 建立连接定时器 TCP建立连接客户端发送第一个SYN后,起一个定时器(默认3s),如果SYN丢失,定时器到后会重发SYN,配置/proc/sys/net/ipv4/tcp_syn_retries查看重传次数,时间倍数递增
  2. 重传定时器 TCP发出数据时设定,超时未收到ACK则重传
  3. 延迟应答定时器 延迟应答时使用,延迟应答是为了提高网络传输的效率(糊涂窗口综合症)
  4. 坚持定时器 专门为对付零窗口通告而设立,发送端收到零窗口通告则启动,发送探测报文段
  5. 保活定时器 收到消息则重置保活定时器,如果超时(通常是2小时),则每75s(发送10次)发送一个探测报文段,若收不到响应则终止连接
  6. FIN_WAIT_2定时器 主动断开连接一方发送FIN收到ACK后进入FIN_WAIT_2状态,此时启动该定时器,当对端一直不发送数据,超时后终止连接
  7. TIME_WAIT定时器 2MSL定时器,主动关闭方进入TIME_WAIT状态时启动,定时器设定为1分钟,TCP控制块被删除,端口号可重用

大端和小端的区别

  • 大端和小端都是指主机字节序,网络字节序采用大端的方式
  • 小端将低位字节存放在内存的低地址端,高位字节存放在内存的高地址端
  • 大端将低地字节存放在内存的高地址端,高位字节存放在内存的低地址段
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    栈  由高地址向低地址增长 116进制为 0x00 00 00 01
    |----| 高地址
    |0x00|
    |----|
    |0x00|
    |----|
    |0x00|
    |----|
    |0x01|<---&x p 低地址
    |----|
    | |
    |----|

    #include <iostream>
    #include <string>

    using namespace std;

    int main()
    {
    //方法1
    unsigned int x = 1;
    unsigned char *p = (unsigned char*)(&x);
    cout << (((int)(*p) == 1) ? "小端" : "大端") << endl;

    //方法2
    union {
    unsigned i;
    unsigned char c;
    }un;
    un.i = 1;
    cout << ((un.c == 1) ? "小端" : "大端") << endl;
    return 0;
    }

参考资料

  1. Linux高性能服务器编程
  2. TCP三次握手的第二个ack丢了会怎样
  3. TCP连接建立的三次握手过程可以携带数据吗?