【计算机网路】TCP/IP协议栈 文章目录一、TCP/IP协议栈整体架构二、应用层业务逻辑的载体常见协议DNS域名解析系统三、传输层端到端的可靠保障端口号进程的唯一标识特性UDP协议轻量无连接传输协议格式核心特点适用场景与注意事项TCP协议可靠的面向连接传输协议格式核心机制1. 确认应答2. 超时重传3. 连接管理4. 滑动窗口5. 流量控制6. 拥塞控制7. 延迟应答8.捎带应答9.面向字节流10.异常情况处理URG与PSHTCP与UDP对比四、网络层IP协议协议格式IP协议/网络层的功能地址管理IP地址的分配与划分分类与CIDRIP地址不足的解决方案NAT机制下网络通信是如何进行的网段划分路由选择路由表转发过程五、数据链路层物理链路的传输基础以太网主流的局域网技术以太网帧格式MAC地址与IP地址的区别MTU最大传输单元对上层协议的影响ARP协议IP与MAC的映射桥梁工作流程六、TCP/IP协议的实际应用与面试重点经典应用场景高频面试题解析一、TCP/IP协议栈整体架构TCP/IP协议栈采用分层模型从上到下依次为应用层、传输层、网络层、数据链路层层和物理层。每一层都有明确的职责通过层间接口协作完成数据传输上层依赖下层提供的服务下层为上层屏蔽实现细节。应用层面向具体业务定义数据交互规则传输层端到端数据传输负责可靠性、流量控制核心协议为TCP、UDP。网络层跨网段路由选择定义IP地址及数据包转发规则。数据链路层物理链路数据传输处理MAC地址、帧封装及ARP寻址。这种分层设计的优势在于模块化清晰某一层的技术升级不会影响其他层的正常工作极大提升了协议的扩展性和维护性。二、应用层业务逻辑的载体应用层是TCP/IP协议栈的最上层直接面向用户需求所有我们熟悉的网络应用都运行在这一层。应用层的核心作用是定义特定业务的数据格式和交互流程它不关心底层数据如何传输只专注于满足业务需求。例如网页浏览依赖HTTP/HTTPS协议定义了请求头、响应体的格式及状态码规则。域名解析依赖DNS协议实现域名到IP地址的映射解决IP地址难记忆的问题。文件传输依赖FTP、TFTP协议规定了文件上传下载的步骤和数据编码方式。我们之前编写的Java Socket程序也属于应用层本质是通过自定义协议完成特定业务。常见协议DNS域名系统底层使用UDP协议实现高效解析浏览器会缓存DNS结果以提升访问速度。当输入URL后浏览器首先通过DNS查询目标服务器IP再发起后续连接。HTTP/HTTPS超文本传输协议HTTP基于TCP明文传输HTTPS通过SSL/TLS加密常用于网页、接口通信。详细讲解 HTTP与HTTPS通信协议FTP/SSHFTP21端口用于文件传输SSH22端口用于远程登录均基于TCP实现可靠传输。DNS域名解析系统DNS可以认为是应用层协议,也可以认为是一套系统。它能将人类易于记忆的域名如 www.csdn.com翻译成计算机可识别的 IP 地址76.76.21.21让用户无需记住复杂的数字 IP即可通过域名访问网站、发送邮件等网络服务。可以通过ping命令查看域名对应的IP地址用户输入域名 → 设备向 DNS 服务器发送查询请求DNS 服务器返回对应的 IP 地址 → 设备通过 IP 地址连接目标服务器加载网页 / 服务。思考如果每次发起请求都需要访问DNS系统DNS需要承受海量的并发量如何解决本地缓存机制电脑不会在每次请求服务器时都触发DNS请求。在访问了一次csdn.com就会在本地把IP记录下来下一次再访问就不会触发DNS请求了。分布式分层架构DNS服务器不只有一个而是有很多。存储原始数据的服务器称为DNS根服务器全世界仅11个各种网络运营商可以搭建“DNS镜像服务器”数据与根服务器相同。三、传输层端到端的可靠保障传输层位于应用层和网络层之间负责将应用层数据可靠地从发送端传输到接收端核心是端口号、TCP协议和UDP协议。端口号进程的唯一标识端口号是传输层的核心概念用于区分同一主机上的不同应用程序与IP地址配合实现端到端通信。特性端口号范围0-1023为全球通用端口号如HTTP的80、HTTPS的443由IANA分配1024-49151为在IANA登记的端口49152-65535为动态端口号供客户端程序临时使用通信结束后被系统收回。通信标识通过“源IP源端口目的IP目的端口协议号”五元组唯一标识一个网络通信可通过netstat -n命令查看。常见的固定端口号注意一个进程可以绑定多个端口号例如服务器可同时监听80HTTP和443HTTPS端口。一个端口号不能被多个进程绑定端口号是进程的唯一标识同一时间只能被一个进程占用。UDP协议轻量无连接传输UDP用户数据报协议是一种简单的传输层协议传输过程类似寄信无需提前建立连接。协议格式UDP首部仅8字节分成四个字段源端口、目的端口、长度整个数据报最大64K和校验和校验出错直接丢弃每个字段各两字节16位。核心特点无连接知道对端IP和端口即可直接发送无需三次握手。不可靠无确认应答和重传机制数据丢失不会通知应用层。面向数据报应用层交付的报文原样发送不拆分、不合并。没有拥塞控制网络出现拥塞不会降低发送效率很适合多媒体通信的要求。支持一对一多对一一对多多对多等交互通信。总结来说简单方便但不可靠适用场景与注意事项适用场景实时性要求高、允许少量丢包的场景如视频通话、语音聊天、DNS解析。注意事项若传输数据超过64K需在应用层手动分包、拼装基于UDP的应用层协议包括NFS、DHCP、DNS等。TCP协议可靠的面向连接传输TCP传输控制协议是传输层的核心协议专为可靠传输设计通过一系列机制解决丢包、乱序、重传等问题是大多数核心业务的首选。协议格式TCP首部最小20字节4*5最大60字节16位源端口号与16位目的端口号传输的核心内容4位首部长度4bit0-15由于选项存在导致TCP报头长度是可变的。这里以4字节为单位。15对应的长度就是60字节选项补充信息可有可无32位序号/确认序号用于按序传输和确认接收。保留位为未来扩展信息留出操作空间6位标志位SYN建立连接、ACK确认应答、FIN关闭连接、RST重置连接、PSH立即推送、URG紧急数据。16位窗口大小用于流量控制告知发送端当前可接收的最大数据量。核心机制1. 确认应答TCP为每个字节编号编号是连续递增的在序号部分填写载荷部分第一个字节的序号接收端收到数据后返回确认序号填写收到的数据载荷最后一个字节序号1也就是表示1001的数据都收到了下一次从1001开始发送确保数据不丢失。TCP报头不参与编号序号和确认序号都是针对载荷的数据发送存在后发先至的情况序号就可以为数据排序保证应用程序通过socket api读到的数据InputStream顺序和对方写入的数据顺序OutputStream正确的。TCP 会在接收方安排的接收缓冲区内存中操作系统内核里通过网卡读到的数据先放到缓冲区里面后续代码调用read。再从缓冲区中读取。缓冲区中根据序号排队确保前面的数据收到read才会解除阻塞如果后面数据先到read则会继续阻塞不会读取数据。基于TCP写代码不需要担心顺序问题而基于UDP实现拆包组包需要考虑顺序就会麻烦很多。2. 超时重传当A给B发送数据在一定时间内A没有收到ACKA就认为发生丢包了。通过引入超时时间来判断是否丢包。发送端未在规定时间内收到确认会重传数据。超时时间动态调整初始为500ms重传后按2倍、4倍递增累计多次失败则关闭连接。当超时次数或者等待时间达到一定限度就会认为是网络出现故障放弃这次传输。当A没有收到ACK可能是 A-B 发送数据过程中丢包也可能是 B-A 返回ACK过程中丢包。但是A无法判断是哪种情况都会进行重传。如果是 A-B 数据丢失重传可以解决如果 B-A 过程中ACK丢失A再重传就会导致B收到两份一样的数据。在接收缓冲区会根据序号进行去重操作排序操作如果存在则丢弃不存在则放入。保证应用程序只收到一份数据。确认应答和超时重传是TCP最核心的两个机制保证了TCP进行可靠传输。3. 连接管理通过三次握手建立连接四次挥手关闭连接。握手或挥手操作发送不携带业务的数据通过这个数据“跟对方打个招呼”。1 建立连接SYN是指synchronized同步。与多线程的概念不同这里的同步指“数据上的同步”A告诉B接下来我要和你建立连接需要你把我的关键信息保存下来同时你也要把你的信息同步给我。把TCP报头的SYN部位填1表示同步报文。B确认应答ack和发送syn可以合并这样就是“三次握手”。注意关键信息包括IP和端口号。IP保存在携带着TCP的IP报头中端口号保存在TCP报头中。而syn和ack都不携带载荷。客户端发起syn。客户端和服务器只是角色同一程序在不同场景可以扮演不同角色主动的一方是客户端。syn和ack都是内核负责的与用户代码无关。可以保证是同一时机发送这样就可以合并。思考三次握手有什么意义解决了哪些问题三次握手相当于“投石问路”先初步探查网络的通信链路是否通畅。验证通信双方发送能力和接收能力是否正常。如果只握手两次无法让双方都确认收发能力正常因此三次握手是必不可少的。而四次握手又没必要。协商一些关键信息。例如序号从几开始。初始序号一般不从0开始因为传输过程中存在丢包现象。举个例子第一次传输由1000开始这过程中可能有数据迷路第二次传输由8000开始如果此时第一次传输中迷路的数据才到达就可以很好的判断出这不是有用的数据可以丢弃。2断开连接四次挥手不可以合并因为ACK和FIN两次交互的时机不一定相同。内核收到FIN会第一时间返回ACK与应用程序的代码无关第二个FIN则是代码调用socket.close或者进程结束才会触发。第二个FIN与ACK很可能不处于同一时机。三次握手中一定是客户端主动发起SYN第一次握手一定是客户端开头四次挥手中客户端与服务端都可以主动发起FIN取决于谁先调用close实际开发中客户端主动断开连接的可能性比较大。借助TCP服务器部分的代码理解四次回挥手异常情况服务器始终不调用close站在A的视角上A已经给B把FIN发了很久B没有后续的挥手操作A就会主动释放连接也就是把B的核心信息删掉站在B的视角上由于代码有bug连接还存在虽然还保存对方信息但是无法进行正常的数据通信了4. 滑动窗口无需等待每段数据的ACK可连续发送多个数据段提升传输效率。窗口大小越大吞吐量越高由操作系统通过发送缓冲区维护。一直持续发送不等待显然是不科学的因为这样就没有可靠性了如果2001ack比1001先到那么就不需要等待1001ack直接往后走两个格子就行。因为确认序号本身的含义就是当前序号之前的数据全部收到可以从当前序号开始发送。2001ack本身就包含1001ack。注意窗口越大批发量数据就越多效率就越高。但是窗口不能无限大会影响可靠性。滑动窗口只是在可靠传输的基础上提高效率。引入可靠性肯定会使效率折损不可能会比UDP还高。丢包问题丢ack后一个ack可以涵盖前一个ack因此不需要做任何处理丢数据快速重传只是谁丢了就重传谁其他已收到的数据无需再重传整个重传过程是很快的注意:超时重传和快速重传是针对不同情况的重传机制并不矛盾。超时重传传输的数据量小没有构成滑动窗口的批量传输机制快速重传传输的数据量大可以形成滑动窗口5. 流量控制滑动窗口窗口越大效率就越高。但窗口不能无限大接收方的处理能力是有上限的这里的上限与代码逻辑有关。把接收缓冲区理解为蓄水池发送的速度就相当于蓄水的速度应用程序从缓冲区汇总读取数据就相当于放水每读一个字节就可以把这个字节从缓冲区中删除了。如果“水溢出”就会丢包。流量控制就是让发送方“踩刹车”可以根据接收方自身的处理速度反馈给发送方限制对方的发送速度。补充每个Socket对象都对应一组接收缓冲区和发送缓冲区。也就是说一个程序创建了N个Socket对象就会有N个发送缓冲区和接收缓冲区。在Java中创建Socket对象Socket clientSocket new Socket()内核中的文件描述符表就会多一项文件对象这个文件对象包括发送缓冲区和接收缓冲区都是字节数组缓冲区与缓存的区别缓冲区buffer把低效操作次数变少把多次低效操作合并为一次既可以读也可以写缓存cache也是把低效操作次数变少把之前读过的数据放到一个更近更方便的地方只用来读不涉及写TCP报头中的16位窗口大小就是接收方接收缓冲区的剩余空间大小。发送方会按照这个属性来动态调整发送的滑动窗口大小。16位滑动窗口可以保存64kb内容但其实TCP报头滑动窗口的最大数值不是64kb选项中包括窗口扩展因子这样的属性窗口大小窗口扩展因子通过左移使其指数级增长这样可以表示非常大的数值。这样就很好的规避了UDP有上限的问题。缓冲区满时窗口置为0发送端停止发送并定期探测。6. 拥塞控制依据传输链路的转发能力进行限制。根据“做实验”的方式定性确定合适的窗口大小先按照小的窗口发送数据如果没有出现丢包就加大速度如果出现丢包就减小速度。这样不断的调整就会达到一个动态平衡。通过慢启动、拥塞避免、快重传、快恢复机制避免网络拥堵。慢启动阶段拥塞窗口指数增长超过阈值后线性增长丢包时调整阈值并重置窗口。拥塞控制和流量控制都能限制发送方窗口大小最终窗口大小取两者较小值7. 延迟应答默认情况下接收方在收到数据包的一瞬间就返回ACK。但是可以通过延时返回ACK的方式来提高效率。还是以蓄水池类比流量控制是通过接收缓冲区剩余空间大小来确定窗口大小的。如果等待一段时间应用程序就会处理部分数据这样返回的窗口大小会增加也就提高效率了。注意延时应答不一定100%能提高效率还取决于应用程序处理数据的速度。不是每收到一个包都需要延时应答。有一定的限制数量限制每隔N个包就应答一次不会因为少了ack影响可靠性因为后一个确认序号可以包含前一个时间限制超过最大延迟时间就应答一次8.捎带应答捎带应答是基于延时应答的。返回应用层业务数据时捎把ACK也带回去。如果没有延时应答返回ACK与返回响应的时机是不同的ACK是内核负责返回的响应是应用程序负责返回的引入了延时应答后ack就可以等一段时间如果恰好此时需要返回响应就可以把ack代入响应数据一起返回。ack包含内容ACK值设为1窗口大小设为接收缓冲区剩余值确认序号设置为合适序号这些内容都是在TCP报头中与相应数据并不冲突。这样两个包合并为一个就可以提高效率了。四次挥手中中间的ACK和FIN就可以捎带应答一起返回。9.面向字节流面向字节流TCP将应用层数据视为连续字节流通过发送缓冲区和接收缓冲区实现读写解耦。比如发送方分10次写1字节接收方可一次读10字节。粘包问题粘的是“应用层数据包”不是TCP的包。TCP无数据边界在TCP层面上无解需要站在应用层上解决问约定包结束标志比如换行\n。这样只需要一直read直到读到换行就认为读完了一个数据包约定包的长度。在包的前面确定长度。这样接收方先读长度再根据长度读确定的字节。HTTP协议中两种方案都有体现GET请求中没有body使用空行作为结束标志POST请求中有body通过Content-Length决定包有多长像JSON和protobuf这样的成熟方案已经把粘包问题解决了而自定义的应用层协议是需要考虑粘包问题的。10.异常情况处理TCP通信中可能会遇到的特殊情况1. 某个进程崩溃进程崩溃和主动断开没有任何区别都是进程释放回收文件描述符表中的资源调用socket.close发送FIN触发四次挥手。进程虽然没了但是TCP连接信息还在四次挥手还是可以正常进行的。2. 主机关机正常流程关机本质上还是先关闭所有的用户进程与上一条相同。关机也是需要一定时间如果没有在时间内已经完成了四次挥手假设B的FIN来的太迟A已经关机B无法收到A返回的ACKB再重发FIN也不会收到ACKB就会认为对端出现严重问题就会主动放弃连接把保存A的信息都删除。3. 主机掉电1接收方断电B-A发送数据A突然断电B后续发送数据都没有ACK了B触发超时重传也不能解决问题。重传到一定次数就会触发“重置TCP连接”B主动发送一个复位报文标志位RST置为1B就会单方面释放连接了。2发送方断电A-B发送数据B发现A不再发送了 B无法区分A是暂停发送还是挂机就会先等一段时间。一段时间后B给A发送“心跳包”上面谈到的窗口试探包也是心跳包不携带任何业务数据载荷只是为了触发ACK。心跳包周期性的类似于心跳。如果对方“有心跳”B就会继续等待如果对方“没有心跳”B就会认为对方挂了通过发送RST单方面释放连接。这也是TCP中的保活机制在分布式系统中心跳包的思想应用非常广泛。虽然TCP内置了心跳包但是在实际开发中通常是需要重新实现心跳包的效果。因为TCP的心跳包周期太长了是分钟级别的而我们希望在秒或者毫秒级别就能感知到对方是否还正常存活从而触发后续操作。心跳包与RST的区别心跳包是存活检测信号属于正常的通信。如果收到了ACK还可以正常通信。RST是强制断开指令属于错误处理机制告知对方“链接已失效”无需完成四次挥手直接释放连接。4. 网线断开A-B发送消息站在A视角与“接收方掉电”的情况是一样的站在B视角与“发送方掉电”情况是一样的。以上几种特殊情况虽然经过一些波折但还是可以顺利结束连接的。URG与PSHURG紧急指针位正常来说TCP安寨序号顺序发送和接收。紧急指针相当于“插队”配合16位紧急指针跳过前面的数据从某个特定的序号开始read。PSH催促标志位如果发送方的数据带有这个标志接收方就会尽快的将这个数据read到应用程序中TCP与UDP对比特性TCPUDP连接方式面向连接三次握手无连接可靠性可靠确认、重传、排序不可靠无确认重传传输效率较低机制复杂、开销大较高首部简单、无开销适用场景文件传输、接口通信、登录机房内部主机间的通信、视频通话、语音、DNS解析四、网络层网络层的核心作用是在复杂网络中找到合适的传输路径实现跨网段数据转发核心是IP协议、地址管理和路由选择。IP协议IP协议定义了IP地址格式和数据包转发规则是跨网段通信的基础。主机配有IP地址但是不进行路由控制的设备路由器即配有IP地址也能进行路由控制节点主机和路由器的统称协议格式IP首部最小20字节关键字段包括版本号versionIPv432位地址和IPv6128位地址目前IPv6正在逐步普及。首部长度与TCP相同与选项配合可以变长。单位都是4字节最大60字节。8位服务类型TOS4位有效位最小延时、最大吞吐量、最高可靠性、最小成本并且这四位中只能选择一个。剩余三位已经弃用一位是保留位。16位总长度IP数据包总字节数包括报头载荷最大65535字节。IP协议内置了拆包组包功能。比如IP携带一个比较大的TCP数据报IP协议就会自动拆成多个通过多个IP数据报共同传输一个TCP数据报。16位标识标识哪几个数据包是在一起的。拆包时把拆出来的包设为相同的标识组包时把相同的标识组到一起。13位片偏移描述了先后顺序。比如组包时把片偏移小的放在前面片偏移大的放在后面3位标志位其中一个标志位表示是否触发拆包操作还有一个标志位表示当前包是否是最后一个8位生存时间TTL表示一个IP数据报能够在网络上传输的最大时间。单位是“次数”默认为64根据具体情况调整也可以是128每经过一个路由器减1避免路由循环导致数据包无限转发。8位协议标识传输层使用哪种协议源IP/目的IP标识发送端和接收端的网络地址。IP地址本质上是通过32位整数表示的但是不方便阅读于是采用点分十进制表示。如果基于UDP实现传输超过64kb的数据就可以在应用层协议中可以指定标识符指定片偏移指定标志位IP协议/网络层的功能地址管理通过IP地址唯一标识网络中的主机或路由器。路由选择路由器收到IP数据包后根据目的IP查询路由表转发到下一跳。地址管理IP地址的分配与划分IP地址是网络层的核心标识分为网络号和主机号两部分用于区分不同网段和同一网段内的主机。分类与CIDR传统分类将IP分为A、B、C、D、E类A类0.0.0.0-127.255.255.255适用于大型网络B类128.0.0.0-191.255.255.255适用于中型网络但存在地址浪费问题。CIDR无类域间路由通过子网掩码区分网络号和主机号例如192.168.1.1/24表示子网掩码前24位为1255.255.255.0网络号为192.168.1.0主机号范围0-255。IP地址不足的解决方案DHCP动态分配IP地址仅给接入设备分配地址提高利用率。但这没有从根本上解决IP不足的问题NAT机制IP分为外网和内网两种一个外网IP对应一系列的内网设备。一个设备有一个独立的局域网IP允许重复多个设备共用一个外网IP不允许重复。这是当前的主力方案私有IP用于局域网内部通信无需注册包括10.*、172.16.*-172.31.*、192.168.*不同局域网可重复使用。公网IP用于互联网通信全球唯一需向运营商申请。IPv6128位地址空间是解决IP地址不足的终极方案。但目前全世界的普及程度很低中国是普及程度最高的国家已经超过了80%。但是IPv4与IPv6不兼容革新成本很高。NAT机制下网络通信是如何进行的同一局域网下设备A访问设备B 由于IP不会重复NAT不会起到作用公网设备A访问公网设备B公网IP不会重复NAT不会起到作用不同局域网设备A不可以访问设备BNAT机制禁止这样的访问方式。局域网设备访问公网设备需要通过网络地址映射1局域网设备向公网设备发送信息如果在同一局域网中有多个设备局域网中若干个设备共用一个公网IP。实际上一个公网IP背后代表着成千上万个局域网设备。注意不是带有公网IP就一定会触发NAT机制要看原来是不是私网IP。如果私网IP已经经过一个公网IP并触发了NAT机制再经过下一个公网IP就不会再次触发了。2公网设备向局域网设备返回信息网络通信涉及五元组源IP目的IP源端口目的端口以及协议类型。可以通过端口号进行进一步的区分。把端口信息也补充在图中在路由器触发NAT地址替换的时候会自身维护一个类似哈希表的结构记录替换的映射关系路由器通过服务器返回的数据中的目的IP和目的端口号查表再转发数据。如果同一局域网的两个设备的相同端口号同时访问这个公网设备呢路由器可以灵活的改动端口号避免重复。公网设备不可以主动访问局域网设备。上述情况公网设备可以根据映射关系将信息返回到局域网设备。而没有信息来自局域网的情况下公网设备不可以访问局域网设备可以通过内网穿透、VPN虚拟私人网络特殊手段解决但这些手段并不和NAT冲突本质上是借助其他带有公网IP的设备进行转发网段划分把一个IP地址分为两部分前半部分称为网络号后半部分称为主机号以我的电脑为例在同一局域网中网络号必须相同主机号必须不同两个相邻的局域网中网络号必须不同主机号没有限制。一个路由器有WAN口IP和LAN口IP这两个IP就在两个不同的局域网中路由器的功能就相当于把两个局域网连接到一起了。这两个局域网就可以称为相邻局域网网络号和主机号不是绝对固定的还需要依靠子网掩码来区分。子网掩码区分IP地址中网络部分和主机部分可以帮助设备判断目标IP是否在同一局域网进而决定直接通信还是通过路由器转发。格式与IPv4格式对应32位二进制数也是采用点分十进制表示。规则左半部分全是1右半部分全是0不会出现1 0交替的情况。1对应IP地址的网络位0对应主机位。默认子网掩码针对传统分类 IP 地址有固定默认值无需手动设置A 类地址首段 0-126255.0.0.08 位网络位B 类地址首段 128-191255.255.0.016 位网络位C 类地址首段 192-223255.255.255.024 位网络位家用网络一般是255.255.255.0可以简写为192.168.120.1/2424代表24位1特殊的IP地址将IP地址的主机地址全部设为0就成了网络号代表这个局域网。例如192.168.120.0将IP地址的主机地址全部设为1就成了广播地址例如192.168.120.255。往广播地址发送数据包就会被转发给局域网中的所有设备。只能通过UDP传输。127.*用于本机环回测试通常是127.0.0.1无论本机真实IP是多少都可以用它来表示主机号为1比如192.168.120.1,在IP协议中只是普通IP在实际组网中通常使用这个IP作为网关的IP。网关网络的入口/出口。家庭中网关一般是路由器在企业或者复杂网络结构中一般是单独的物理设备。路由选择路由选择是网络层的核心功能指路由器根据路由表确定IP数据包的转发路径过程类似“一跳一跳问路”。路由表路由器维护一张路由表包含目的网络地址、子网掩码、下一跳地址、发送接口等信息可通过route命令查看。直连路由目的网络与路由器直接相连无需转发。静态路由由管理员手动配置。动态路由通过路由协议如OSPF、RIP自动生成。转发过程以目的IP为202.10.1.2为例主机查询路由表发现无匹配条目。按默认路由将数据包发送到网关路由器如192.168.10.1。网关路由器根据自身路由表转发数据包依次经过多个路由器最终到达目标主机。五、数据链路层物理链路的传输基础数据链路层位于网络层之下负责处理物理链路的帧封装、MAC地址寻址、MTU限制等问题确保数据在相邻设备间可靠传输。以太网主流的局域网技术以太网不是一种具体的网络而是一种技术标准既包含了数据链路层的内容也包含了物理层的一些内容。规定了网线类型双绞线、传输速率10M/100M/1000M、帧格式等。以太网是当前最广泛的局域网技术与以太网并列的哈有令牌环网、无线LAN等。以太网帧格式以太网帧长度为46-1500字节核心字段包括目的MAC/源MAC6字节网卡出厂固化的硬件地址用于相邻设备寻址。每个网卡都会有一个唯一的MAC地址并且是完全够用的。MAC也可以作为电脑的身份标识以我的电脑为例类型字段标识上层协议。0800对应IP协议0806对应ARP请求/应答8035对应RARP请求/响应。CRC校验码验证帧数据的完整性校验出错则丢弃。MAC地址与IP地址的区别IP地址描述“终点地址”类似快递的收件人地址跨网段有效。MAC地址描述“区间起点/终点”类似快递的每一段运输节点地址仅在相邻设备间有效。相邻设备香港路由器/交换机/主机通过网线直连就可以称为相邻设备。例如从主机A发送数据到外网主机BIP地址始终是A和B的地址而MAC地址在每一跳都会变为当前路由器和下一跳路由器的地址。MTU最大传输单元MTU是数据链路层对帧数据的最大限制以太网MTU为1500字节超过则需分片。对上层协议的影响IP协议超过MTU的IP数据包会被分片每个分片有相同的标识号接收端重组后交给上层。任意分片丢失则重组失败IP层不负责重传。UDP协议UDP数据报最大长度为64K若数据超过1472字节1500-20IP首部-8UDP首部会被IP分片丢失概率增加因此UDP适合传输小包。TCP协议通过MSS最大分段大小协商避免分片MSSMTU-IP首部-TCP首部建立连接时双方通过SYN报文告知自身MSS选择较小值作为最终标准。ARP协议IP与MAC的映射桥梁ARP地址解析协议介于数据链路层和网络层之间负责将IP地址转换为MAC地址解决“知道IP但不知道MAC”的寻址问题。工作流程主机A想与主机BIP172.20.1.2通信查询本地ARP缓存表若无B的MAC地址则发送ARP广播目的MACFF:FF:FF:FF:FF:FF。同一网段内所有主机接收广播仅主机B发现IP匹配返回ARP应答包含自身MAC地址。主机A将B的IP-MAC映射存入ARP缓存表过期时间20分钟后续通信直接使用该映射。六、TCP/IP协议的实际应用与面试重点经典应用场景服务器开发需深入理解TCP的连接管理、滑动窗口、拥塞控制避免CLOSE_WAIT状态堆积需正确调用close关闭socket。网络编程UDP适合实时通信需手动处理分包、重传TCP适合可靠传输需解决粘包问题定长包、长度字段、分隔符。网络故障排查通过netstat查看连接状态arp -a查看ARP缓存route查看路由表定位丢包、连接失败等问题。高频面试题解析TCP三次握手和四次挥手的原因三次握手确保双方收发能力正常四次挥手因TCP全双工需分别关闭发送和接收通道。TIME_WAIT状态的作用持续2MSL报文最大生存时间确保迟到的报文消失避免端口复用导致的数据错误。用UDP实现可靠传输参考TCP机制在应用层实现序列号、确认应答、超时重传、滑动窗口等功能。NAT的优缺点优点是解决IP不足无需更新硬件缺点是无法从外部访问内部服务器转换表维护有开销。