
干了十几年网络经常被刚入行的同事追问“TCP和UDP到底啥区别”“五层模型和七层模型哪个才是对的”这俩问题看着基础真要讲透彻也不容易。很多人背了七层协议的名字却不知道分层到底解决什么问题记住了TCP三次握手却说不清为什么视频通话要用UDP。这篇文章把网络分层模型和两大传输协议一次讲透从设计思路到实际应用结合我这些年踩过的坑和积累的排查经验帮你把这些底层知识真正变成干活时能用的工具。1. 内容整体设计与思路拆解1.1 分层模型到底解决了什么问题网络这个东西本质上就是把一台机器上的数据搬到另一台机器上。但现实中的网络远比“搬数据”复杂数据可能经过光缆、双绞线、无线电波中间要经过交换机、路由器、防火墙两端可能是Windows、Linux、Android上层跑的可能是网页、视频、文件传输。如果没有一个统一的规则每个环节各自为政整个系统根本无法互通。分层模型的核心价值就是把“网络通信”这个大问题拆成若干个相对独立的小问题每一层只干自己那一摊事只跟上下两层打交道。这跟公司里的部门划分是一个道理销售部不需要懂研发怎么写代码研发部也不用管销售怎么谈客户大家只要把接口约定好整个公司就能正常运转。五层模型和七层模型本质上都是这套思路的产物。OSI七层模型是国际标准化组织ISO提出的参考模型从下到上依次是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层它把功能拆得很细甚至连“数据格式转换”“会话管理”都单独抽成一层。而TCP/IP五层模型也叫TCP/IP四层模型是互联网实际运行的标准它把OSI的上三层会话、表示、应用合并成了一层——应用层。我遇到过不少新手纠结“到底该记五层还是七层”我的建议是两个都要理解但理解的角度不同。七层模型是理论框架帮你建立全局视野五层模型是实际情况抓包、配防火墙、排查问题时用的是五层。实际工作中你跟别人说“这是传输层的问题”对方立刻明白你指的是TCP或UDP这一层不会有人去纠结这是会话层还是表示层的毛病。1.2 五层和七层的对应关系五层模型和七层模型的对应关系其实很清晰用一张表记就足够了五层模型七层模型典型协议/设备核心职责应用层应用层、表示层、会话层HTTP、DNS、FTP、SMTP为用户提供网络服务负责数据格式和会话管理传输层传输层TCP、UDP提供端到端的通信处理可靠性和流量控制网络层网络层IP、ICMP、路由器负责寻址和路由选择决定数据走哪条路数据链路层数据链路层以太网、交换机在直连的两个节点之间传输帧处理MAC地址物理层物理层网线、光纤、集线器传输原始比特流处理电压、光信号、接口规范五层模型把“网络接口层”作为最底层实际上它融合了物理层和数据链路层两层的功能。这个合并处理是合理的因为在TCP/IP的设计哲学里物理层和数据链路层的实现细节你用的是光纤还是双绞线、走的是以太网还是WiFi对上层是透明的只要能把IP数据包从一个节点搬到下一个节点就行。在实际工作中这个分层的边界感非常重要。比如一个网页打不开的问题如果判断是应用层HTTP报错直接看服务器日志如果发现TCP握手都不成功那就得往网络层查连通性。分层思维能帮你快速缩小排查范围避免像没头苍蝇一样乱试。2. 七层模型各层职责与实操对照2.1 从物理层到传输层的逐层解读七层模型里我重点说几个层因为这些是实际工作中最常用的。物理层处理的是最原始的比特流网线断了、光衰过大、接口松动这些问题都出在物理层。我在机房干活时有个习惯遇到网络不通先看网口指示灯灯不亮直接查物理连接——这比抓包分析效率高得多。数据链路层负责把比特流组织成帧Frame通过MAC地址在直连的局域网设备之间传输。交换机的MAC地址表、VLAN划分、链路聚合这些配置都发生在这一层。帧的格式里包含了源MAC和目的MAC数据包在局域网内每次经过一台交换机都会被重新封装成新的帧但里面的IP地址不变——这个细节在抓包分析时很实用看到MAC地址变化而IP不变说明数据在二层设备之间跳转。网络层是三层的核心IP协议在这里工作。这一层解决的问题是“数据如何从源主机到达目的主机中间可能跨越多个网络”。路由器根据路由表来决定把数据包转发到哪里IP地址负责全局寻址。ICMP这个常被忽略的协议也在网络层ping命令用的就是它。排查网络问题时ping是最直接的连通性测试手段但很多人不知道ping通了只代表网络层通了不代表上层服务正常——端口不通、防火墙拦截、应用崩溃这些都可能让业务无法访问。传输层就是我们今天的主角TCP和UDP所在的位置。这一层的核心任务是为上层的应用进程提供通信服务引入了“端口”的概念。IP地址定位的是主机端口定位的是主机上的具体进程。很多人刚学网络时搞不懂为什么要同时有IP地址和端口我常用宾馆来类比IP地址是宾馆的地址找对了楼还不够还得知道你要找的人在几号房端口号就是那个房间号。2.2 会话层、表示层和应用层为何常被合并OSI七层模型里的会话层、表示层、应用层在TCP/IP模型中被合并成了一个应用层。这背后其实是有现实考量的。会话层管的是“建立、管理和终止会话”表示层管的是“数据格式和加密解密”。在实际的网络系统中这些功能很难独立成层——比如TLS传输层安全协议做加密和身份验证它既涉及握手过程的会话管理又涉及数据的加密表示但它工作在应用层和传输层之间很难用OSI的“表示层”去准确定位。从工程师的视角看把这三层合并成应用层更实用。为什么这么设计因为TCP/IP模型的理念是尽量简化层次让开发者直接调用socket接口来写网络应用不需要关心会话管理和数据表示这些细节。操作系统的socket API把传输层和应用层之间的交互接口固定下来应用层只需要调用send()、recv()这些函数底层的TCP握手、分段、重传全部由内核完成。这也是我在教学中常给学员强调的一点OSI七层是“学术参考”TCP/IP五层是“工程实现”。面试如果问七层你得能说出每层功能实际排障时你按五层模型去分层定位问题效率最高。2.3 数据封装与解封装过程数据从一层到另一层不是简单的传递而是要经过“封装”或者“解封装”。应用层的HTTP请求数据传给传输层传输层给数据加上TCP头源端口、目的端口、序号、校验和等再往下传给网络层加上IP头源IP、目的IP、TTL等再往下到数据链路层加上MAC头和帧尾。到对端后逐层剥掉各层头部最终拿到原始数据。我建议每个学网络的人亲手用Wireshark抓一次包观察HTTP请求的完整生命周期。在抓包结果里展开一个HTTP数据包你能清清楚楚看到四层信息最外层是以太网帧头MAC地址、然后是IP头、TCP头、最里面是HTTP数据。亲眼看到这些封装的层次结构比背十遍“封装解封装”都管用。抓包时还有一个很实用的技巧关注TCP头的“Flags”字段。SYN、ACK、FIN、RST这些标记位组合可以直观地看出TCP连接处于什么状态。比如你看到一个SYN发出后没有回应基本可以断定对端服务没监听或防火墙拦截了——这些问题在后面的排查部分我会详细说。3. TCP与UDP协议核心细节解析3.1 TCP的可靠性从何而来TCP传输控制协议是互联网最核心的传输协议HTTP、HTTPS、FTP、SMTP全都基于它。TCP最大的特点就是“可靠”这个可靠性不是凭空来的而是一系列机制的叠加效果。首先是连接的建立。TCP通信前必须先建立连接这就是著名的“三次握手”。客户端先发送SYN报文服务端回应SYNACK客户端再回应ACK连接建立。为什么要三次而不是两次核心原因是防止失效的历史连接请求突然到达服务端导致服务端白白建立一条虚连接。两次握手无法让双方确认彼此的收发能力都正常只有三次握手才能同步双方的初始序列号。其次是确认与重传。TCP给每个字节编号接收方收到数据后返回ACK确认号发送方如果超时没有收到ACK就重传数据。这个机制保证了数据不会因为网络丢包而缺失。第三是流量控制与拥塞控制。流量控制用滑动窗口机制接收方告诉发送方“我还能收多少数据”避免发送方把接收方的缓冲区撑爆。拥塞控制则是为了应对网络中的拥堵慢启动、拥塞避免、快重传快恢复这些算法让TCP既能充分利用网络带宽又不会把网络搞崩溃。工作中我常跟人打比方TCP像顺丰快递——寄件前双方确认握手每次送货要有回执ACK超时了重新派送重传包裹太多要排队控制速度流量控制中途堵车了自动换路线重路由。这些机制叠加起来才保证了“数据可靠到达”。3.2 三次握手与四次挥手过程拆解三次握手是TCP面试必问的内容很多人背得滚瓜烂熟但真正排查问题时不一定能理解到位。这里我结合抓包的视角再展开讲一下。第一次握手客户端发送SYN报文序列号seqx随机生成的初始序列号表示“我想跟你建立连接”。 第二次握手服务端收到SYN回复SYNACK报文序列号seqy确认号ackx1表示“我收到了你的同步请求我也可以跟你建立连接”。 第三次握手客户端收到SYNACK回复ACK报文确认号acky1表示“我已经知道你能接收了”。三次握手的本质是双方各自确认对方的“发送能力”和“接收能力”。第一次握手后服务端确认客户端能发第二次握手后客户端确认服务端能收能发第三次握手后服务端确认客户端能收。从语义上讲只有这三步才能让双方都确认“……可以了”。连接断开时的四次挥手也同样重要。假设客户端主动关闭连接 第一次挥手客户端发送FIN报文表示“我的数据发完了我想关闭连接”。 第二次挥手服务端返回ACK表示“我收到了关闭请求”。 第三次挥手服务端数据发送完毕后发出FIN报文表示“我的数据也发完了可以关闭了”。 第四次挥手客户端返回ACK表示“收到连接关闭”。为什么断开要四次比建立多一次因为TCP支持半关闭状态。客户端发送FIN后它就停止发送数据了但服务端可能还有没发完的数据所以服务端先回ACK表示“我知道你要关了”然后等服务端把剩余数据处理完毕再发自己的FIN。四次挥手保证了服务端数据可以完整发完再优雅关闭。3.3 UDP为什么简单但不可替代UDP用户数据报协议和TCP截然不同。它没有建立连接的过程没有确认机制没有重传机制也没有流量控制。数据来了就发发完不管网络丢包了就丢了。那UDP的价值在哪里答案是低延迟和低开销。TCP的可靠性机制带来的是额外成本握手需要时间ACK报文占用带宽重传可能造成数据乱序拥塞控制会主动压低速率。这些机制在某些场景下反而成了缺点。典型场景就是实时音视频通话。视频通话要求延迟低、帧率稳定。如果走TCP一旦某个数据包丢失触发重传接收方等待重传数据就会卡顿TCP的拥塞控制还可能主动降速导致画面模糊。而UDP没有这些负担——丢几个包画面花一下下一帧马上补上来人眼的感知并不明显。语音视频领域常用的RTP就是基于UDP的。另外游戏领域也偏爱UDP。FPS类射击游戏、MOBA类游戏玩家操作的每一条指令都需要极低延迟地送达到服务器。TCP三次握手和ACK机制在这种场景下会放大延迟。你按下“开枪”到服务器收到经过TCP的握手、确认过程可能比别人多用几十毫秒——高手对决中这几十毫秒就是生与死的差别。所以很多竞技游戏直接用UDP或者自定义可靠UDP协议。对比维度TCPUDP连接状态面向连接需三次握手无连接直接发包可靠性可靠有确认重传不可靠尽力而为有序性保证数据有序不保证顺序传输速度比UDP慢机制开销大快没有额外机制数据边界字节流无边界数据报保留消息边界头部开销20字节以上8字节适用场景文件传输、网页、邮件音视频、游戏、DNS查询3.4 TCP和UDP的选择决策场景做了多年网络我总结出一条经验选择TCP还是UDP不是看哪个“更好”而是看业务对延迟和可靠性的容忍度。强调“不能丢数据”的用TCP典型有文件传输FTP、网页浏览HTTP、邮件SMTP。这些场景中数据完整性高于一切——你下载一个压缩包哪怕只丢一个字节整个文件就打不开了。强调“实时性优先、可以接受小部分丢包”的用UDP典型有语音视频通话、直播、在线游戏。这些场景中时效性是第一位的数据晚到往往比不到更糟——一个迟到的画面帧已经没有展示的意义了。还有一个中间地带很多技术的解决思路是“用UDP做传输在应用层自己实现可靠性”。Google的QUIC协议就是这么干的它在UDP之上实现了类似TCP的可靠传输、拥塞控制和多路复用有效解决了HTTP/2的队头阻塞问题。HTTP/3就是基于QUIC的。这个思路说明TCP和UDP的边界并不是固定的工程师完全可以按业务需求定制传输策略。4. 实操过程与核心环节实现4.1 用nc命令快速测试TCP与UDP的差异网络调试工具ncnetcat是我在实际工作中使用频率最高的工具之一它简单到让人觉得不像是真的但确实强大到能覆盖大部分测试场景。先看TCP测试。在一台机器上启动一个监听服务nc -l 8080在另一台机器上连接nc 192.168.1.10 8080这两条命令建立起一条TCP连接然后你可以在两端互相发送文本消息测试通信。连不上的话先检查IP能不能ping通再看目标机的防火墙是否放行了8080端口最后看服务是不是确实在监听——这个排查过程本身就是TCP连接建立的实战演练。再看UDP测试nc -lu 8080nc -u 192.168.1.10 8080注意加了-u参数表示走UDP。UDP测试有个特点如果对方端口根本没有程序在监听发送端不会像TCP那样收到“连接被拒绝”的明确错误UDP没有握手、没有失败通知包发出去就石沉大海了。实测时很多人以为“没反应就是通了”这是误解。我在测试UDP服务时通常配合抓包软件确认数据是否真的发出去且被收到避免误判。4.2 查看网络状态与传输层连接详情的常用命令Linux下最常用的查看网络状态的命令是netstat和ss。ss -tulnp这条命令列出所有监听的TCP和UDP端口。-t指TCP-u指UDP-l指监听中的-n用数字地址显示不解析域名-p显示占用端口的进程信息。排查“端口被占用”时这个命令非常高效。比如你启动服务时提示8080端口被占用用ss -tlnp | grep 8080就能看到是哪个进程占用了。-p参数会显示进程PID和名称你不用再去翻PID列表。查看TCP状态机也有专门工具ss -tan | grep ESTAB | wc -l统计当前已建立的TCP连接数。做性能测试或者观察连接是否异常堆积时这几个命令是基础中的基础。我记得有一次线上服务突然变慢用这个命令查了一下发现TIME_WAIT状态的连接堆积了上万条顿时就明白了是短连接频繁建立和关闭导致的。把连接池调大后问题立刻缓解。4.3 用Wireshark抓包分析TCP握手与UDP报文抓包分析是理解协议最直观的手段。Wireshark是主流工具功能很全但新手容易在几百上千条报文里迷失方向。这里分享我的操作习惯。抓TCP握手时先设置过滤条件tcp然后在浏览器访问目标网站回来看抓包结果。找到第一条SYN报文右键选择“Follow → TCP Stream”就能只看这一条TCP连接的所有报文。你会清晰地看到三次握手的SYN、SYNACK、ACK链路以及后面的HTTP请求、响应数据、四次挥手。抓UDP则简单得多。比如向DNS服务器发一个域名解析请求抓包过滤udp.port 53你能看到DNS查询报文和响应报文。UDP报文头只有8字节四个字段源端口、目的端口、长度、校验和。没有序列号、没有确认号、没有状态标记——对比TCP二十字节的头差距一目了然。这里还想分享一个小技巧抓本机环回口流量时Wireshark在Linux上可能需要root权限在Windows上需要安装WinPcap/Npcap驱动。抓到loopback流量后你会发现源IP和目的IP都是127.0.0.1TCP的连接状态仍然正常建立和断开这正好验证了一个理论——TCP协议栈不关心IP地址是否合法只要IP层能路由就行。4.4 nginx配置中TCP和UDP的负载均衡实践负载均衡是网络运维中常见的实际场景。nginx的主流使用场景是HTTP反向代理走TCP但其实nginx从1.9.0版本开始支持UDP负载均衡。先看TCP的4层负载均衡配置stream { upstream backend { server 192.168.1.10:8080 weight5; server 192.168.1.11:8080 weight5; server 192.168.1.12:8080 backup; } server { listen 80; proxy_pass backend; } }这个配置把所有打到80端口的TCP流量分发到后端三台服务器。backup参数表示第三台是备用机前两台挂了才会启用它。再看UDP负载均衡典型的场景是DNS服务器集群stream { upstream dns_backend { server 192.168.1.10:53; server 192.168.1.11:53; } server { listen 53 udp; proxy_pass dns_backend; } }UDP负载均衡和TCP不同在于listen指令加上了udp关键字还有一点需要特别注意UDP负载均衡默认是每个UDP数据包独立分发可能同一个客户端的多个数据包被分发到不同后端。对于DNS这种一对一请求-响应的场景问题不大但如果业务中有状态关联如某些游戏服务器要求同一用户连到同一后端就得用hash指令做一致性哈希把特定客户端的流量固定到同一台后端。stream { upstream game_backend { hash $remote_addr consistent; server 192.168.1.10:9000; server 192.168.1.11:9000; } server { listen 9000 udp; proxy_pass game_backend; } }4.5 网络测速工具背后的TCP/UDP原理大家可能都用过Speedtest或者类似的网络测速工具但很多人不知道测速工具背后的原理和TCP/UDP有直接关系。Speedtest默认走的是HTTPS——也就是TCP连接。它通过并行建立多条TCP连接同时在客户端和服务端之间传输大块数据然后统计单位时间内传输的数据量算出下行速度和上行速度。这就解释了为什么测速时要选择离你较近的服务器——TCP连接存在往返时延RTTRTT越大会直接影响慢启动阶段的速率爬升测出来的速度就会偏低。部分局域网测速工具则走UDP。UDP测速的逻辑更简单发送端以固定速率向接收端注入UDP数据包接收端统计每秒到达的报文数量和字节数。因为UDP没有流量控制和拥塞控制测出来的就是网络的“硬吞吐量”。UDP测速比TCP更能暴露网络链路中的丢包率——TCP遇到丢包会自动重传测出来只是速度慢UDP遇到丢包直接丢统计丢包率一目了然。排查网络质量时我一般先用ping看延迟和丢包率如果ping正常但下载速度不佳再用UDP测速工具看是不是丢包过高。两个维度结合起来定位网络问题要快得多。5. 常见网络问题排查与避坑实录5.1 网络不通的分层排查流程网络排查是有方法论的核心思路就是“分层定位”从底层往上逐层排查哪一层出了问题就修哪一层。我通常按以下顺序排查先确认物理层。看网口指示灯是否正常闪烁网线是否松动WiFi是否断开。这一层的问题最容易被忽略也最好排除。二层验证。检查ARP缓存能否获取到目标MAC地址局域网内ping网关通不通。ping不通网关可能是交换机端口VLAN配置错误或MAC表异常。三层验证。ping外网IP如223.5.5.5确认路由是否正常检查本机IP地址、子网掩码、默认网关配置是否正确。四层验证。检查目标端口是否开放防火墙是否放行。用telnet ip port或者nc -zv ip port测试端口连通性。应用层验证。确认HTTP服务返回的状态码查看应用日志是否有报错。这套流程的价值在于不跳步。我见过很多同事一上来就看应用日志查了半天发现服务器根本没上线也见过有人拼命刷新DNS缓存结果问题只是因为网线松了。按照分层逐级排查能省掉大量无效劳动。5.2 端口不通的常见原因对照表端口不通是网络运维中出现频率最高的问题。同样是端口不通可能的原因从物理层到应用层都有。现象可能原因定位方法ping通但端口不通服务未监听端口ss -tlnp 或 netstat -an 查看监听状态ping通但端口不通防火墙拦截iptables -L -n / firewall-cmd --list-allping通但端口不通云安全组配置遗漏登录云控制台查看安全组规则端口时通时不通服务进程崩溃重启查看服务日志和进程状态端口时通时不通负载均衡后端的健康检查异常检查nginx/HAProxy日志端口不通且TCP握手超时三层路由不通traceroute 跟踪路由路径我踩过一次很典型的坑在云服务器上配置好服务本机测试一切正常但外网就是连不上。排查到最后发现是云安全组只放行了TCP 443端口但服务监听在8080端口——云安全组默认隔离外部流量很多人容易忽略这个“隐藏防火墙”。5.3 TCP连接状态异常的诊断思路TCP连接的状态异常是传输层排查中最常见的问题。ss -tan输出里的状态类型每种都值得关注。SYN_SENT状态持续存在说明客户端发出去的SYN没有回应。可能是服务端没开机、端口未监听或者防火墙丢弃了SYN包。用tcpdump -i eth0 port 8080抓包看看SYN是否真的发出去了以及有没有SYNACK回来就能确定问题出在哪一跳。大量的TIME_WAIT状态通常是短连接频繁建立和关闭造成的。正常请求量下TIME_WAIT数量会有波动但如果堆积得越来越多会影响新连接的建立因为端口被占满了。解决办法是开启连接复用net.ipv4.tcp_tw_reuse或改用长连接模式。大量的CLOSE_WAIT状态说明对端已经关闭连接发了FIN但本端没正确调用close()。这通常是应用代码里的bug——socket对象没有正确关闭。我在排查一个Java服务时遇到过几千个CLOSE_WAIT连接查代码发现是异常分支里忘了关连接加上finally块修复后就好了。5.4 局域网内常用网络架构与配置要点局域网配置是另一个高频应用场景。企业网络里最核心的架构是VLAN划分和ACL控制这涉及到二层和三层设备的核心配置。VLAN的用途是把一个物理局域网隔离成多个逻辑隔离区域。比如研发部、财务部、行政部分别使用不同的VLAN各部门之间无法直接互访降低了内部安全风险。但VLAN的配置有个容易踩坑的点交换机端口默认是ACCESS口只属于一个VLAN如果设置错误就会导致该端口的主机无法和其他VLAN的主机通信。VLAN间通信需要三层设备的支持一般是在交换机上配置SVISwitch Virtual Interface或者通过路由器做单臂路由。我在配置时通常会同时想清楚各VLAN之间要开放哪些流量——只开放必要的访问策略避免因ACL遗漏导致安全隐患。ACL配置的常见误区是把规则顺序搞错。路由器执行ACL时是自上而下匹配的匹配到第一条规则后就不再往下执行。把“全允许”permit ip any any写在开头的ACL后面写再多限制都是废的。这个坑我中过一次当时试图限制某个部门的网络访问配完发现完全没生效检查半天才意识到规则顺序反了。5.5 刚上手时最容易犯的几个错误最后整理几个新人在网络相关工作中最常见的错误都是我亲身经历或者亲眼见过别人踩的。第一是抓包时不设过滤条件直接全量抓结果几秒钟抓了几万条报文根本不知道从哪看起。正确做法是先明确要排查什么再使用过滤条件比如只要TCP端口的、只要某个IP地址的。第二是ping通了就认定网络没问题。ping走的是ICMP协议只验证网络层是否可达。ICMP可达不代表TCP端口可达更不代表应用服务正常。测试HTTP服务至少要用curl来看返回状态码。第三是改了配置后不验证就继续干活。修改了ip地址、防火墙规则、路由表之后一定要先做连通性测试再继续不然一个配置错误可能导致整个网络中断再回头排查的代价很大。第四是把UDP当作TCP来用。有人习惯性在UDP编程里等“连接成功”的信号但UDP压根没有连接这个概念。sendto之后没有任何反馈是正常的需要自己通过收包确认或者应用层协议来保证可靠性。第五是忽视了MTU的问题。在一些特殊网络环境比如PPPoE拨号下默认MTU 1500可能导致UDP大包被拆分或丢弃表现为视频卡顿、游戏掉线但网页正常。排查这类问题用ping加-M do -s 1472参数测试大包MTU很快就能定位。6. 从分层模型到实战的一点体会花了整个下午把这些网络基础概念串成一条线最后说几句自己的心得体会。分层模型和TCP/UDP这些知识刚学的时候觉得抽象枯燥但在实际工作中它们越来越显得重要。不管是你给服务器配置防火墙规则、用Wireshark抓包排障还是优化网络性能、排查应用问题到最后都会发现所有操作都在跟这几层协议打交道。TCP和UDP的选择也不是一锤子买卖而是需要根据业务特性持续观察、不断调整的过程。我个人在实际操作中最深的体会是网络排障最忌讳的就是“凭感觉猜”。每次排查问题先把问题分层定位确认当前故障在哪一层再动手去查每次改动配置之前先想清楚这一层的改动会不会影响相邻层。用这个思路干活网络问题基本上都能找到准确的根源而不是靠运气解决。这些基础的东西不会随着技术和工具的更新过时反而是让你能一直干下去的根本。