ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

计算机网络入门:从数据包的旅程到TCP三次握手

计算机网络入门:从数据包的旅程到TCP三次握手 刚接触计算机网络那会儿我有个特别真实的感受书上的每个字都认识但这些字凑起来就不知道在说什么。什么面向连接的传输服务、数据报交换、三次握手背了一堆名词回头别人问我那HTTP和TCP到底谁先谁后我又答不上来。后来我发现问题出在哪——我一直在一层层地背协议但从没先搞清楚一个最根本的问题数据到底是怎么从一台电脑跑到另一台电脑的。一旦把这条主线想通了什么分层、端口、IP地址、三次握手全都有了挂靠的位置。这篇笔记不想做正经教科书就围绕我当年学的时候最容易绕晕的几个知识点说说我是怎么把它们拆开了、理解了、最后能在脑子里串成一条线的。1. 先打通主线数据从一台电脑到另一台电脑其实是在做接力赛教计算机网络的老师不一定讲这个故事。我先把最朴素的场景摆出来你在浏览器地址栏敲了一个网址按下回车几毫秒后网页出现了。这一下按键后面到底发生了什么我习惯用一个比喻——寄快递。你在网上下单买了个杯子商家把杯子装进纸箱纸箱上贴了收货地址快递员根据地址把包裹送到中转站中转站再送到下一站最后到了你家楼下你拆开纸箱拿到杯子。网络传输几乎就是同一件事只不过杯子变成了数据。1.1 从浏览器敲网址开始数据的装箱过程当你敲下网址应用层先产生一份HTTP请求报文。这就是你买的杯子。但报文不能直接塞进网线里它需要一层层包装传输层在HTTP报文前面加一个TCP段头里面包含源端口和目的端口端口号的作用就是告诉接收方这份数据交给哪个应用程序。网络层再把TCP段整个包成一个IP数据报在头部写上源IP地址和目的IP地址这就是快递单上的收件地址。链路层再把IP数据报封装成帧加上的MAC地址相当于快递员交接时的名字解决的是同一网段内到底哪台设备接这个包的问题。物理层最实在把帧变成一串电信号或者光信号推上线路。这个过程叫封装每经过一层就套一层外壳。接收方做相反的事从物理层收到信号去掉帧头拿到IP数据报再去掉IP头拿到TCP段最后去掉TCP头把HTTP报文交还给应用。这叫解封装。1.2 为什么每层都要套一层壳把一次通信拆成四段接力一开始我会问能不能直接一个包头搞定所有信息答案是不行。原因特别朴素——不同层解决的是不同尺度的问题。端口解决的是数据到了这台电脑之后交给哪个进程。IP地址解决的是数据从哪台主机到哪台主机。MAC地址解决的是数据在同一个局域网内从一个接口到另一个接口。如果把这些信息全塞在一个系统里那链路层的设备更新换代时所有上层的设计都得跟着改谁受得了。分层的好处就像公司分部门一样链路层换了光纤技术上层完全不用感知接口不变就行。这也解释了为什么协议栈能沿用几十年。想通这条主线之后再看后面所有知识点都是在回答这条主线某一环的为什么和怎么做。这也是我强烈建议所有初学者学的第一件事不是背七层模型而是跟着一个请求走完一遍完整旅程。2. 分层模型不必死记五层结构背后是分工明确的组织架构大多数国内教材用五层分法物理层、数据链路层、网络层、传输层、应用层。有些教材讲OSI参考模型会多出表示层和会话层。初学者常被七层和五层搞晕我当初也一样后来发现只需要记住一句话现在的互联网实际运行模型基本就是五层OSI那两层已经融入应用层了。至于分层逻辑理解各司其职比背出每一层功能更重要。2.1 每一层到底管什么用生活场景翻译一下应用层管说话的内容。HTTP、FTP、DNS、SMTP都是这一层的协议负责规定双方交换什么样的数据格式。传输层管数据怎么可靠地送过去。TCP在这里干重活负责切割、编号、确认、重传UDP则一切从简只负责把数据扔到对方端口。网络层管路怎么走。IP协议负责定址、分组、路由选择。数据链路层管同一个链路内的帧传递。交换机在这里工作。物理层管信号长什么样。网线、光纤、无线电磁波用的都是这一层。当我把每一层想象成一个公司里的不同部门时所有名词都有了位置。上层是老板下层是跑腿每层只和相邻层打交道不需要关心隔层的事。2.2 数据单位这一串名字搞懂一次就不晕传输层TCP的叫报文段网络层IP的叫数据报链路层的叫帧。刚学的时候经常混我也混过后来靠一个联想记牢数据报的报是一整份信帧的帧是一格一格的画面链路层距离最短看成一段一段的帧就很自然。对应到前面说的封装过程报文段被装进数据报数据报被装进帧一层套一层到了物理层变成比特流。2.3 从自顶向下还是自底向上学各有各的场景《计算机网络自顶向下方法》给初学者的友好之处是直接从应用层讲起第一章不碰物理信号先讲应用层协议理解和成就感都来得快适合自学入门。谢希仁的《计算机网络》按五层从下往上讲顺序更接近数据包的旅程起点偏工程和应试期末复习和考研通常走这个体系。湖科大教书匠的视频课在考研圈口碑很好优点是手绘动画把协议交互过程画得极其清楚适合逻辑型学习者。我不建议纠结选哪本——第一遍自顶向下建立全局第二遍用谢希仁体系补细节和考点这两条路其实指向同一个终点。3. 应用层HTTP、DNS这些协议本质上是双方事先说好的规矩应用层是初学者最好上手的一层因为不用碰底层信号看报文内容就能理解。这里我挑三个最常见的协议HTTP、DNS、FTP。3.1 HTTP无状态是它的特点Cookie是它的补救HTTP是浏览器和服务器之间的对话协议。它规定了两种基本动作浏览器发请求Request服务器回响应Response。请求里有请求行、请求头部、请求体响应里有状态行、响应头部、响应体。初学者最好拿开发者工具里的Network面板直接看一遍真实请求比背十遍结构都管用。HTTP有一个被反复强调的特性叫无状态——服务器不会记住你之前跟它说过什么每个请求都是独立的。设计成这样是为了简化服务器不用为每个用户维护一堆现场信息。但无状态太死板购物车需要记状态于是就有了Cookie和Session服务器在响应里塞一个Cookie浏览器下次带回来服务器一认就认得你了。这经常是面试和期末都喜欢考的小点不要只背无状态要能说清无状态带来什么问题又用什么机制补上。3.2 DNS把网址翻译成IP地址的那台电话簿机器之间通信靠IP地址人记不住一串数字于是有了域名系统。你在浏览器输入一个域名DNS会把域名换成对应的IP地址。完整的解析过程是这样的先查浏览器缓存再查操作系统hosts文件和系统DNS缓存都没有就请求本地DNS服务器。本地DNS服务器如果没有缓存会代替你去问根域名服务器再一层层问下来直到某个权威DNS服务器给出答案。这个过程叫递归查询和迭代查询的组合初学者理解到本地DNS先去问问不到再往上追溯就够了不用一开始就啃报文格式。常见考题是DNS用的端口是什么。DNS用的是UDP的53端口原因是域名查询报文短小一次往返就能完成不需要连接管理只有在区域传送这种大数据量场景才会用TCP。这里顺便说一个通用规律短小高频、丢了可以重查的用UDP大体积、要求可靠送达的用TCP。记住这个规律很多端口记忆题目都能推出来。3.3 FTP一个控制连接一个数据连接两个连接怎么配合FTP比HTTP多一个有意思的地方它用了两个连接。控制连接走21端口负责传命令比如登录、切换目录数据连接走20端口负责传真正的文件内容。为什么要拆两个因为命令要可靠、简单立刻响应而文件传输可能持续很久如果把命令和数据搅在一起一边传大文件一边发新命令处理起来很麻烦。分开之后命令通道始终清爽。这个控制面和数据面分离的思路很多工程系统都能看到影子不只在FTP里。学应用层时我的建议是不要只看协议名词要学会用抓包工具去看真实报文。抓包工具装好后跑一次HTTP请求、看一次DNS查询这些亲眼所见的理解比背书牢固十倍。4. 传输层TCP三次握手为什么三次四次挥手为什么四次传输层是计算机网络里最让初学者头疼的部分。因为它不只是一个协议而是一整套保证可靠传输的机制序号、确认、重传、窗口、连接管理。我理解TCP的切入点很简单它要解决两个问题——在不可靠的底层之上实现可靠的数据传输让多个应用共享网络时能把数据正确地分发。4.1 三次握手不是三句废话每一步都有明确目的建立连接时客户端发SYN包seqx服务器回SYNACK包seqy, ackx1客户端最后再发一个ACK包acky1。三次握手的核心目的是确认双方的发送能力和接收能力都正常同时同步初始序号。为什么要三次而不是两次关键在防止失效的连接请求。想象一个场景客户端的第一个SYN因为网络拥塞迟迟没到客户端超时后重发SYN服务器收到第二个SYN并建立连接数据传输完关闭。这时第一个SYN终于慢悠悠地到达服务器服务器以为客户端又想建立新连接就回了个SYNACK等待客户端确认。如果只用两次握手服务器在不知道客户端是否收到的情况下就建立了连接资源就白白浪费了。三次握手之后服务器发现等不到客户端的后续确认就知道这个连接没有建立不会维持空转的资源。这讲的是为什么是三次。还有一层含义三次握手之后双方都确认了我能发你也能收你能发我也能收连接才算真正建立。4.2 四次挥手为什么断开的环节多一次断开时主动关闭方发FIN被动方回ACK然后被动方发FIN主动方最后回ACK。四次挥手里多出来的那个步骤是因为TCP允许半关闭——一方发完FIN表示我的数据发完了但我不关闭接收。被动方可能还有数据要发所以先回ACK告诉对端你的FIN我收到了等它的数据发完再发自己的FIN。三次握手是双方一次完成同步四次挥手却是两个方向的关闭分开进行所以多一次往返。这里面最容易被考试抠的细节是TIME_WAIT。主动关闭方发出最后一个ACK之后并不会立刻关闭而是进入TIME_WAIT状态一般等2倍的MSL报文最大生存时间。为什么要等如果最后一个ACK丢失了被动方会重发FIN主动方得有时间再回一个ACK否则被动方永远等不到关闭确认。4.3 TCP vs UDP一张表讲清选型逻辑维度TCPUDP连接状态面向连接无连接可靠性可靠确认、重传、排序尽力而为不保证传输单位字节流数据报文速度偏慢有握手和确认开销快无状态开销典型应用HTTP、FTP、SMTPDNS、视频直播、游戏初学时容易有一个误区觉得TCP就是好的UDP就是差的。实际不是视频会议延迟大时宁可丢一两帧也不能卡住等重传直播场景用UDP加应用层纠错是常态。选型就看应用能承受丢还是等。5. 网络层与IP地址数据报的寻路系统网络层在我心里是整张网络的骨架。这里要理解三件事IP地址长什么样子网掩码在干什么路由器怎么选路。5.1 IP地址不是随便写的一串数字IPv4地址共32位分四段每段8位。传统分类方式把地址分成了A、B、C、D、E五类。A类第一个字节是1-126B类128-191C类192-223D类组播E类保留。为什么这么分因为早期设计者想让不同规模的网络用不同范围的地址A类支持超大型网络C类适合小网络。但这种分类方法浪费严重——一个C类网络最多只有254台主机一个B类却有六万多台很多机构申请了B类地址却用不满。于是后来有了无分类编址用192.168.1.0/24这类写法表示网络前缀长度/24就代表前24位是网络号后8位是主机号。现在考试和工程里基本都以无分类为主老的分类更多是为了理解历史和做基础题目。5.2 子网掩码和网段划分其实是一家人子网掩码把IP地址切成网络号主机号。想要知道两台主机是不是同网段把两边的IP和子网掩码做按位与运算结果相同就在同一网段可以直接进行链路层通信不同则必须把包交给路由器由路由器转发到别的网段。这个按位与的运算非常关键我推荐每个初学者在纸上手算三次算完就彻底记住。比如192.168.1.10和192.168.1.88这两个地址配上255.255.255.0的掩码按位与的结果都是192.168.1.0说明它们在同一个网段。如果换成192.168.2.10按位与结果变成192.168.2.0跟前面不一样那就必须走路由器了。这种计算在配置设备、排除网络故障时天天在用。5.3 路由器怎么选路为什么下一跳比完整路径更聪明路由器的工作原理可以简化成一句话查路由表找到匹配的目的网络把数据报交给对应的下一跳接口。完整的端到端路径不用事先存在任何一台路由器的脑子里。每台路由器只需要知道去目标网络最近的下一条是谁就像你问路时有人告诉你往前走两个红绿灯右转而不是规划好你全部十公里的行程。路由协议RIP、OSPF、BGP就是路由器之间互相交换路由信息最终收敛出一张无环的转发表。5.4 内网地址与NAT一个外网IP怎么养活一屋子设备私有IP地址段10.0.0.0/8、172.16.0.0/12、192.168.0.0/16可以在任何局域网里重复使用它们不会出现在公网路由表里。家用的路由器会把内网设备的私有地址转换成一个公网出口地址这技术叫NAT。作用很直接家里十来台设备共用一个运营商分配的公网IP上网外网看到的都是同一个出口地址内网设备通过端口号区分。理解NAT对排网络故障很有用家里的内网IP正常但上不了网先怀疑NAT和默认网关配置公司服务器要对外提供服务必须配置端口映射把公网端口对应到内网某台服务器。这是纯工程经验教科书里写得少但真实工作中天天用。6. 给初学者的实操路线与复习建议学计算机网络最怕没有一个整体的进度感。我的建议是第一遍刷主线第二遍补细节第三遍做题和抓包验证。三条线交织推进不要想着全看懂再动手。6.1 第一遍按一个数据包的旅程拎主线不用纠结每个报文字段先把HTTP请求→TCP段→IP数据报→帧→比特→收到后反向拆包这条链路走通。这个过程用抓包最直观开抓包工具抓一次访问网页的过程能看见DNS查询、TCP三次握手、HTTP请求响应以及每个包上的协议层次标签。6.2 第二遍按教材分章节做笔记这时候选一本主流教材当骨架。谢希仁《计算机网络》的知识组织和考研科目匹配度高如果完全没基础先用《计算机网络自顶向下方法》打开视野。湖科大教书匠在B站的视频课对考研和期末复习都适用手绘动画看协议流程非常清楚很多读者反馈比纯文字教材更容易建立逻辑。期末复习时可以用以下顺序自查协议与端口对应的数字表→TCP/UDP头字段→三次握手四次挥手的状态迁移→IP分片和子网掩码计算→路由算法→DNS解析流程→HTTP响应码含义。每一块做完就刷对应章节的题库王道和历年期末题都可以。6.3 第三遍用工具把书上说的变成自己见过的用Wireshark抓包看HTTP请求首部和DNS报文用ping和tracertWindows/tracerouteLinux观察网络层实际路径用netstat查看本机TCP连接状态观察ESTABLISHED和TIME_WAIT用虚拟机搭两个网段中间加一台Linux路由器亲手配置静态路由看不通时怎么排查。这些工具用起来都不难但亲手配过一次路由再看路由表就不觉得抽象是真实体会。6.4 初学阶段最容易踩的几个坑把MAC地址和IP地址混为一谈。IP解决跨网段寻址MAC解决同链路内的帧传递。把UDP不可靠理解成UDP天生会丢包。网络都会丢包UDP只是丢了不重传可接受丢包的应用反而更合适。背了三次握手四次挥手却画不出状态迁移图。推荐一定手画一遍状态图画完就通了。学完应用层就直接跳到传输层没有全局观。回到第1节的主线再走一遍每次都建立新连接。我个人最深的感受是计算机网络这门课通和不通之间只差一层窗户纸而那层窗户纸就是整体流程。什么时候你能不翻书从敲网址开始讲到对方服务器返回网页的全过程每一层的职责和关键协议都脱口而出这门课就算真学进去了。后面的细节比如拥塞控制、流量控制、IPv6都只是往这条主线上挂更多分支而已。
返回列表