TCP/IP四层模型重点协议解析

文章目录

    • 应用层
      • DNS协议
      • NAT
      • NAPT
    • 传输层协议
      • TCP
      • UDP
        • UDP协议段格式
        • UDP特点
        • 基于UDP的应用层协议
        • ※ 经典面试题
    • 网络层协议
      • IP协议
    • 数据链路层协议
      • 以太网
        • 以太网帧格式
        • MTU
      • ARP

这篇博客主要复习 TCP/IP 四层模型中的重点协议网络。

应用层

DNS协议

DNS,即Domain Name System,域名系统。DNS是一整套从域名映射到IP的系统。也叫做域名解析协议,既是一个应用层协议,又是一套系统。
当我们在浏览器中搜索一个网站时,浏览器会根据域名找到对应的IP地址。为什么要使用域名呢?
TCP/IP中使用IP地址来确定网络上的一台主机,但是IP地址不方便记忆,且不能表达地址组织信息,于是人们发明了域名,并通过域名系统来映射域名和IP地址

域名首先是一个字符串,比如www.baidu.com 、www.sogou.com …
域名系统为一个树形结构的系统,包含多个根节点。其中:

  1. 根节点即为根域名服务器,最早IPv4的根域名服务器全球只有13台,IPv6在此基础上扩充了数量。
  2. 子节点主要由各级DNS服务器,或DNS缓存构成。
  • DNS域名服务器,即提供域名转换为IP地址的服务器。浏览器、主机系统、路由器中都保存有DNS缓存。
  • Windows系统的DNS缓存在 C:\Windows\System32\drivers\etc\hosts 文件中,Mac/Linux系统的DNS缓存在 /etc/hosts 文件中。

网络通信发送数据时,如果使用目的主机的域名,需要先通过域名解析查找到对应的IP地址。

  • 域名解析的过程,可以简单的理解为:发送端主机作为域名系统树形结构的一个子节点,通过域名信息,从下到上查找对应IP地址的过程。如果到根节点(根域名服务器)还找不到,即找不到该主机。
  • 域名解析使用DNS协议来传输数据。DNS协议是应用层协议,基于传输层UDP或TCP协议来实现。
    TCP/IP四层模型重点协议解析_第1张图片

如今,使用使用host的场景一般是进行测试程序时,修改host文件,把域名映射到测试服务器IP上(保证不修改源代码进行测试,也不会影响到正常的线上环境)。实际生活中,我们可能会频繁访问DNS服务器?这个如何解决?
① 浏览器/客户端对解析结果进行缓存
② 设置多台DNS服务器(根域名服务器)
③ 构建自己的DNS域名服务器镜像
④ 针对DNS服务器作镜像时可以按域名进一步划分

NAT

之前我们提到,IPv4协议中,IP地址数量不充足的问题。NAT(网络地址替换)技术是当前解决IP地址不够用的主要手段,是路由器的一个重要功能,具体体现在:
NAT能够
将私有IP对外通信时转为全局IP
。也就是就是一种将私有IP和全局IP相互转化的技术方法。
很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP;全局IP要求唯一,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的。
NAT IP转换过程:
TCP/IP四层模型重点协议解析_第2张图片
NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
NAT路由器收到外部的数据时,又会把目标IP从202.244.174.37替换回10.0.0.10;
在NAT路由器内部,有一张自动生成的,用于地址转换的表
当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系。

NAPT

在NAT的基础上,我们遇到了一个问题。如果局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的。那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
NAPT解决了这个问题,我们使用IP+port来建立这个关联关系。这种关联关系是由NAT路由器自动维护的。
例如在TCP的情况下,建立连接时,就会生成这个表项;在断开连接后,就会删除这个表项。
TCP/IP四层模型重点协议解析_第3张图片
NAT技术不可避免的缺陷
① 无法从NAT外部向内部服务器建立连接;
② 转换表的生成和销毁都需要额外开销;
③ 通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开。

传输层协议

TCP

回顾上篇:TCP协议工作机制详解

UDP

UDP协议段格式

TCP/IP四层模型重点协议解析_第4张图片
16位UDP长度:表示整个数据报(UDP首部+UDP数据)的最大长度;
16位UDP检验和:验证当前数据是否会出现问题,只能够进行“证伪”(如果检验和出错,则数据一定是错误的)。如果校验和出错,就会直接丢弃;那么如何进行校验呢?
一般我们常用的有两种方法:
CRC循环冗余校验(循环相加)
数据发送之前算crc,接收之后计算crc。如果发送前,接收后数据内容不变,得到的crc也一致;如果传输过程中发生了比特翻转,内容改变了,crc也不相同。
md5(非对称的哈希算法,针对字符串)
a. 定长:无论输入的字符串是多长,得到的md5值都是固定长度(32位/64位/128位)
b. 分散:只要输入的字符串只变化了一点点,但md5值差别巨大
c. 不可逆:给定原串,很容易得md5值,理论上无法恢复出原始的字符串
使用md5的场景:hash算法、校验和、数据文件加密…

UDP特点

无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接;
不可靠:没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;
面向数据报:(一次发送一次接收)应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并;
缓冲区:UDP只有接收缓冲区,没有发送缓冲区;

UDP没有真正意义上的 发送缓冲区。发送的数据会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;
UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃。

全双工:UDP的socket既能读,也能写。
大小受限:UDP协议首部中有一个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。

基于UDP的应用层协议

NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议(用于无盘设备启动)
DNS:域名解析协议
当然,也包括自己写UDP程序时自定义的应用层协议。

※ 经典面试题

※ 1. 如何基于UDP协议实现数据可靠传输?(考查TCP的可靠性机制)
※ 2. UDP大小是受限的,如果要基于传输层UDP协议,传输超过64K的数据,应该如何设计?

以上两个问题答案类似,都可以参考TCP的可靠性机制在应用层实现类似的逻辑:
① 引入序列号,保证数据顺序;(超时重传数据去重)
② 引入确认应答,确保对端收到了数据;每个数据接收到后反馈ACK(不是内核返回,而是用户自定义应用程序返回ACK包)
③ 引入超时重传,如果隔一段时间没有应答,就重发数据;
④ 实现连接管理(三次握手、四次挥手)
⑤ 如果想要提高效率,实现滑动窗口、为了限制滑动窗口的大小,实现流量控制、拥塞控制、延迟/捎带应答、心跳机制…
从这些方面来回答,比较合适。
※ TCP和UDP对比?什么样的场景适合TCP?什么样的场景适合UDP?
主要从三个方面进行比较:协议格式特点应用场景
前两点比较我们已经在之前的博客当中介绍过了
回顾:Java Socket通信之UDP协议、TCP协议工作机制详解
从应用场景的角度比较:
① TCP用于可靠传输的情况,应用于文件传输,重要状态更新等场景。如果需要可靠性,传输的单个数据报比较长(超过64K),首选TCP;
② UDP用于对高速传输和实时性要求较高的通信领域,比较注重效率,例如,早期的QQ,视频传输等。另外UDP自身支持广播,TCP不支持广播,只能在应用程序中通过多个连接,轮询的方式给每个主机发送数据(伪广播)。
在这两个协议的基础上,还有人对其进行改进,eg:KCP协议

网络层协议

在复杂的网络环境中确定一个合适的路径。

IP协议

地址管理:能够通过一系列的规则,描述网络上的设备地址。
路由选择:根据当下的源地址和目的地址,规划出一条合适的路径。
TCP/IP四层模型重点协议解析_第5张图片
4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。
4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length×4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是60字节。
8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。
16位总长度(total length):IP数据报整体占多少个字节。
16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。
第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果已分片的话,最后一个分片置为1,其他是0。类似于一个结束标记。
13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值×8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
8位协议:表示上层协议的类型。
16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。
32位源地址和32位目标地址:表示发送端和接收端。
选项字段:不定长,最多40字节。

数据链路层协议

应用于两个相邻结点之间的数据传输。

以太网

以太网” 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。
例如:规定了网络拓扑结构,访问控制方式,传输速率等;
例如以太网中的网线必须使用双绞线;传输速率有10M,100M,1000M等;
以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网,无线LAN等。

以太网帧格式

TCP/IP四层模型重点协议解析_第6张图片

MTU

MTU是数据链路层传输数据帧的大小范围,这个限制是不同的数据链路对应的物理层产生的限制。不同的数据链路层标准的MTU是不同的。以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。

  • MTU对IP协议的影响
    由于数据链路层MTU的限制,对于较大的IP数据包要进行分包
    我们将较大的IP包分成多个小包,并给每个小包打上标签; 每个小包IP协议头的 16位标识(id) 都是相同的;在其 3位标志字段中,第2位置为0,表示允许分片,第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0);
    到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层;
    一旦这些小包中任意一个小包丢失,接收端的重组就会失败。但是IP层不会负责重新传输数据。
  • MTU对UDP协议的影响
    一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报。
    这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了。
  • MTU对于TCP协议的影响
    TCP的一个数据报也不能无限大,还是受制于MTU。TCP的单个数据报的最大消息长度,称为MSS(Max Segment Size);TCP在建立连接的过程中,通信双方会进行MSS协商。最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。然后双方得知对方的MSS值之后,选择较小的作为最终MSS。
    MSS的值就是在TCP首部的40字节变长选项中(kind=2)。

ARP

ARP协议:一个介于数据链路层和网络层之间的协议。
ARP协议的作用
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系。
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
因此在通讯前必须获得目的主机的硬件地址。
ARP协议的工作流程
TCP/IP四层模型重点协议解析_第7张图片

  • 源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
  • 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
  • 每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。

你可能感兴趣的:(网络编程,网络协议,网络)