ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

IP地址与TCP协议:计算机网络入门核心解析

IP地址与TCP协议:计算机网络入门核心解析 有一次我给部门新来的同事讲网络基础他问了句特别经典的话我打开浏览器输入一个网址敲下回车中间到底发生了什么我说这个问题要是展开讲基本就是整本《计算机网络》教材。但如果你只是想解决实际工作里的问题——为什么网页打不开、为什么两台电脑明明插着网线却连不上、为什么系统老弹IP地址冲突——真正绕不开的核心其实就两块IP地址和TCP协议。这篇文章就是写给刚入门计算机网络的人。不管你是计算机专业的学生在期末复习还是转行做开发、运维、测试想补基础甚至只是工作中偶尔要配个IP地址、查个网络故障这篇文章都能帮你把底层的概念理顺。我会尽量用大白话把IP地址怎么定位设备、TCP协议怎么保证数据不丢不乱讲清楚顺带把查IP、改IP、排查冲突这些高频实操也一并说透。读完之后你再看到IP地址TCP协议这些词脑子里会有一个完整的画面而不是一堆背了又忘的名词解释。1. 为什么计算机网络入门要死磕这两块1.1 网络通信的本质找到对方说清楚话计算机网络说穿了就做两件事第一把数据从一台设备送到另一台设备第二确保送的过程可靠、到达之后能被正确解读。前者靠的是地址体系也就是IP地址在干活后者靠的是传输规则也就是TCP这类协议在兜底。你可以把网络想象成一个快递系统。你网购了一件商品商家发货时首先要填你的地址——收件人、街道、城市、邮编这套东西对应于网络里就是IP地址和端口。快递公司负责把你的包裹从杭州运到北京中间经过好几个中转站每一站都会根据地址决定下一程往哪走网络里的路由器干的也是这事。但光把包裹送到小区门口还不够快递员还得打电话让你签收你确认东西没坏、没少这次运送才算完成。TCP协议干的就是快递员这套确认签收的活。所以入门计算机网络IP地址解决的是数据去哪TCP协议解决的是数据怎么可靠地到。这两个概念一透后面学DNS、HTTP、子网划分、抓包排查都会顺畅得多。反过来如果这两块糊里糊涂后面越学越像在背天书。1.2 先懂地址再懂传输顺序不要乱我见过不少人一上来就啃TCP三次握手结果越啃越懵。原因是他们对数据包在网络里怎么走完全没有概念握手过程中的SYN、ACK、序列号这些东西就成了空中楼阁。我的建议是倒过来学先搞清楚IP地址知道一台电脑在网络里是如何被定位的再搞清楚数据包怎么从源地址到目的地址最后再看TCP协议在这个链路上做了什么。这个顺序是有道理的。IP地址是网络层的概念它解决的是路由问题也就是数据包该怎么走。TCP协议是传输层的概念它解决的是传输质量问题也就是数据到了没有、顺序对不对。你连路都还没认清楚就去研究怎么保证运输质量等于还没学会开车就研究怎么保养发动机方向就错了。所以这篇文章也按这个顺序来先聊透IP地址再动手做几个和IP相关的实操然后才进到TCP协议的正题。2. IP地址网络世界的门牌号2.1 IPv4地址到底是怎么构成的最常见的IP地址是IPv4长这样192.168.1.100。它本质是一个32位的二进制数为了让人好记才分成四段每段8位转成十进制后用点隔开。每一段的取值范围是0到255因为8位二进制最大就是11111111也就是255。这里有个新手很容易忽略的点IP地址不是单纯的一串数字它是由网络号 主机号两部分组成的。前一部分标识你在哪个网络后一部分标识你是这个网络里的哪台设备。就像快递地址里的北京市海淀区和中关村大街1号院3号楼前半部分是范围后半部分是具体定位。问题来了32位里哪几位是网络号哪几位是主机号这就轮到子网掩码出场。子网掩码也是一个32位的数写成255.255.255.0这种形式。它干的事情很简单把IP地址和子网掩码做一次与运算得到的就是网络号。比如IP是192.168.1.100掩码是255.255.255.0与运算之后得到192.168.1.0这就是这个设备所在的网段。后面的100就是它的主机号。同一个网段里的设备可以直接通信跨网段就得靠路由器转发了。这也是为什么你配置IP地址的时候掩码填错一个数字就可能出现明明在一个办公室却互相ping不通的诡异问题。很多老运维看到这种故障第一反应就是让两边把ipconfig输出贴出来比对大部分时候问题就出在掩码上。2.2 公网IP、私网IP和那几个特殊地址IP地址还分公网和私网。公网IP是全网唯一的相当于你在互联网上的身份证别人访问你的服务器就是通过这个地址找到你。私网IP则是在局域网内部使用的地址它在全球可以重复只要不在同一个局域网里冲突就行。私网IP有几个固定段最常见的三个是10.0.0.0到10.255.255.255172.16.0.0到172.31.255.255还有最常用的192.168.0.0到192.168.255.255。你家里路由器分配的地址基本都是这些段里的。为什么因为IPv4地址总量只有约43亿个而全球设备数量早就远超这个数了。用私网地址把大量设备藏在局域网后面再让它们共用一个公网IP出去这就是NAT网络地址转换技术干的事。还有几个特殊地址值得知道。127.0.0.1是回环地址代表本机自己你ping 127.0.0.1通说明本机网络协议栈工作正常。169.254.x.x是Windows系统在DHCP获取失败时自动分配的备用地址如果你发现电脑的IP变成了这个段基本可以断定是没拿到地址先去查DHCP或者网线。2.3 静态IP和动态IP各有什么坑在局域网里设备的IP获取方式基本就两种静态配置和DHCP动态获取。DHCP就是路由器自动给你分配一个IP设了租约时间到期了可能就换一个。静态IP是你自己填死一个地址不会变。静态IP适合什么场景服务器、打印机、网络摄像头这类设备需要别人稳定访问IP不能老是变。我见过不少公司为了方便把打印机设成动态IP结果哪天断电重启打印机拿到一个新地址所有人电脑里的打印机配置全部失效又得重新找设备。这种坑踩一次就够了网络里的固定设备能设静态IP就设静态IP。但静态IP也有它的坑最典型的就是IP冲突。你手填了一个地址刚好这个地址已经被另一台设备占用了两台设备抢同一个门牌号网络就会时通时断极其诡异。后面我会专门讲怎么排查这个。3. 实操查IP、改IP、解决IP类故障3.1 查看本机IP居然有这么多姿势查IP地址是网工入门第一课不同系统有不同方法。Windows下最常用的是命令行里的ipconfig。按下WinR输入cmd回车敲ipconfig回车就能看到一串信息。重点看两个IPv4地址就是你的IP默认网关是路由器LAN口的地址。如果看到IP是169.254开头的前面说了是没拿到地址排查链路去吧。Linux下对应的命令是ip addr老一点的系统用ifconfig。macOS则在系统偏好设置里能看到终端里也可以敲ifconfig。这里提一句ifconfig输出的信息量很大eth0或者ens33这类名字是网卡名lo是回环接口wlan0是无线网卡。新手容易对着一堆输出发懵其实只看自己关心的那块就行有没有IP、掩码是多少、状态是不是UP。还有一个查公网IP的方法。你在浏览器里搜索IP地址或者访问一些查询网站能看到自己出口的公网IP。注意这个IP是你在互联网上的身份不是你本机的私网IP。很多第一次接触网络的人会疑惑我路由器里看到的IP是192.168.1.x网站上查的却是220.181.x.x到底哪个是真实的两个都是真实的一个是局域网内的地址一个是经过NAT之后对外暴露的地址各管一段。3.2 修改IP地址从Windows到Linux到虚拟机改IP也是高频操作。Windows改IP的路径是控制面板-网络和共享中心-更改适配器设置-右键网卡-属性-选择Internet协议版本4 (TCP/IPv4)-属性然后在里面填IP、掩码、网关和DNS。这里提醒一下如果你是在公司或者学校机房不要随便改尽量用DHCP自动获取需要手动填的时候先确认一下网段信息别凭感觉填。Linux改IP分两种情况。临时修改用ip addr add命令重启网络服务或者重启电脑就没了。永久修改要看发行版CentOS系的配置文件在/etc/sysconfig/network-scripts/ifcfg-eth0Ubuntu系的用Netplan配置文件在/etc/netplan/目录下改完要执行netplan apply生效。很多初学者在Linux上改完IP发现不生效十有八九是忘了重启网络服务或者配置文件格式写错了。虚拟机改IP是另一个高频场景。VMware和VirtualBox里安装的虚拟机网络模式一般有三种NAT、桥接、仅主机。NAT模式下虚拟机共享宿主机IP上网桥接模式下虚拟机直接和宿主机在同一局域网里有自己的独立IP。如果你在虚拟机里设置静态IP后上不了网先检查是不是选了NAT模式但把IP配成了桥接的网段这种错位是新手重灾区。还有一点虚拟机里的网卡名可能是ens33、ens160这种不是常见的eth0写配置文件时别照抄网上的命令先ip addr看一下你机器上实际的网卡名。3.3 IP冲突、IP占用和连接不上的排查思路局域网里IP冲突是出现频率最高的故障之一症状表现很典型设备能连上网但过一会儿就掉线再连又好了反复发作重启有时能缓解但很快又犯。查这个事Windows下可以ping那个怀疑冲突的IP看通不通。然后执行arp -a查看IP对应的MAC地址。如果发现同一个IP对应了两个不同的MAC地址基本实锤IP冲突了。想要更精准地定位可以用一些开源工具。搜索IP地址冲突检测软件能找到不少比如Angry IP Scanner它可以把整个网段扫一遍列出哪些IP在线、对应的MAC是什么。和设备实物对比一下MAC地址就能揪出是谁抢了地址。处理办法也简单冲突的一方改成其他IP或者在路由器上做IP和MAC绑定让这个IP只给特定的设备用。通过IP地址访问公司共享盘也是常见需求。一般在Windows的资源管理器地址栏输入\192.168.x.x回车就能看到共享文件夹。如果进不去从三个方向排查第一你所在网段和共享服务器是否同网段不同网段有没有路由第二是否有权限访问共享通常需要账号密码或者需要在域环境下第三防火墙是否拦了445端口有些杀毒软件会把局域网共享默认禁止。这几个方向走下来八成问题都能找到。4. TCP协议可靠的传输管家4.1 三次握手到底在握什么讲TCP必然绕不开三次握手。我之前见过有的同学把三次握手背得滚瓜烂熟但问他为什么需要三次却答不上来。三次握手本质就解决一个问题确认双方的收发能力都正常。第一次握手客户端发送SYN包告诉服务器我想建立连接。服务器收到后确认了客户端的发送能力没问题。第二次握手服务器回一个SYNACK包意思是我收到你的请求了同时我也准备好了你能收到吗。客户端收到这个包确认了服务器的发送能力正常也确认了自己的接收能力正常。但此时服务器并不知道它的SYN包客户端到底收到没有所以还需要第三次握手客户端再发一个ACK包回给服务器。服务器收到确认了客户端的接收能力正常。到此双方确认了彼此收发都没问题连接正式建立。网上有很多类比我比较喜欢用打电话。你给对方打电话你说喂能听到吗SYN对方说能听到你能听到我吗SYNACK你再说能听到ACK。好了双方确认链路通了开始说正事。三次握手缺一次都不行少了第二次客户端不知道服务器是否收到请求少了第三次服务器不知道客户端是否收到自己的回应。抓包的话你会发现TCP连接建立时的交互非常清晰。用Wireshark抓一个HTTP请求前三个包就是SYN、SYNACK、ACK标志位一目了然。我建议每个学网络的人都亲手抓一次包看看比看十遍教材都管用。4.2 四次挥手断开连接为什么这么麻烦断开连接要四次挥手很多人不理解建立只要三次断开为什么多一次原因在于TCP连接是两个方向的独立通道需要分别关闭。假设客户端要断开连接第一次挥手客户端发FIN包表示我这边数据发完了想关闭我到你的方向。服务器收到后回一个ACK表示知道了但此时服务器可能还有数据要发给客户端所以连接还没完全断开。等到服务器把剩余数据发完再发FIN包表示我这边也发完了可以关了。客户端收到后回ACK双方才真正断开。这里有个重要的机制如果主动断开的是客户端客户端在发出最后一个ACK之后会进入TIME_WAIT状态默认等待2MSL最大报文段生存时间。很多人不理解为什么要等这么久其实就是怕最后一个ACK丢失。如果服务器没收到ACK它会重新发FIN客户端需要留有足够时间处理这个重发。TIME_WAIT期间这个连接的四元组源IP、源端口、目的IP、目的端口还不能被重用所以在高并发的服务器上如果连接大量主动关闭会出现大量TIME_WAIT堆积影响性能。这也是面试和实际运维中经常遇到的问题。接触过Nginx或者网络调优的人应该对TIME_WAIT不陌生。搜tcp协议包如何修改的人不少就是遇到了TIME_WAIT过多或者连接状态异常想通过调整内核参数来优化。比如修改/etc/sysctl.conf里的net.ipv4.tcp_tw_reuse参数允许TIME_WAIT状态的连接重用对缓解这个问题有帮助。这类优化要谨慎生产环境改内核参数之前最好先压测验证别盲目照抄网上的配置。4.3 TCP靠什么保证数据可靠除了建立连接TCP还有几个核心机制保证可靠性。第一个是确认应答机制每发一个数据段接收方都要回一个ACK告诉发送方我收到了序号是xx之前的都到了。第二个是超时重传如果发送方在规定时间内没收到ACK就认为数据丢了重新发一遍。这两个机制配合确保了数据不丢。第三个是滑动窗口有了确认应答但如果一个包一个包地等确认再发下一个效率太低。所以TCP允许发送方连续发送多个数据段不需要等每个确认。允许连续发多少由窗口大小决定。这个窗口是动态调整的接收方可以根据自己的处理能力告知发送方我现在能收这么多这就是流量控制。第四个是拥塞控制。流量控制是管接收方能否承受拥塞控制是管网络是否承受得了。如果网络拥堵还猛发数据只会让情况更糟。TCP通过慢启动、拥塞避免、快重传、快恢复等策略探测网络容量逐步提高发送速率遇到拥塞就减少速率。这个机制保证了网络整体不会因为某个发送方太激进而瘫痪。你可以把拥塞控制想象成高峰期开车上高速刚上匝道时不会一脚踩到120码而是慢慢加速看路况决定要不要继续给油遇到堵车就减速甚至停下来。4.4 TCP和UDP到底怎么选UDP和TCP协议的区别是搜索引擎里的高频问题。简单说TCP是面向连接的、可靠的、有序的字节流服务UDP是无连接的、不可靠的、数据报服务。TCP保证你发的数据能完整有序地到达但代价是建立连接的开销大、头部大、效率相对低UDP不保证可靠但开销小、延迟低能发就能发不跟你磨叽。一个很形象的对比TCP像发挂号信要签收、要留底慢但稳UDP像发漂流瓶扔出去就不管了快但可能丢。实际选型也很简单文件传输、网页浏览、邮件、远程登录这类要求数据完整的应用用TCP视频直播、语音通话、在线游戏这类对实时性要求高、偶尔丢一两帧数据不影响体验的应用用UDP。比如你打音视频电话时如果一卡一顿那大概率是网络质量本身的问题而不是协议选错了。如果面试被问到答出TCP面向连接、可靠、有序UDP无连接、不可靠、无序只是及格分。最好能补充一句TCP的可靠是用复杂度换来的如果需要自己实现可靠性又想要UDP的速度可以在应用层做确认和重传很多游戏和实时通信框架就是这么干的。能说到这个层次说明你是真的理解了两者的取舍。5. 常见问题速查表与避坑心得5.1 高频故障排查速查表把日常工作中最常碰到的网络问题整理成一张表每一条都是实战中踩过的坑现象可能原因排查方向电脑提示IP地址冲突网络时通时断局域网内有人手动配了和你相同的IP用arp -a查看IP对应的MAC结合交换机或路由器找到对应设备能上QQ/微信但浏览器打不开网页DNS配置异常ipconfig /flushdns刷新DNS缓存检查DNS服务器地址是否正确另一台电脑ping不通但网线插着子网掩码不一致两边不在同一网段比对两台设备的IP和掩码IP变成了169.254.x.xDHCP没获取到地址检查网线、路由器DHCP服务、防火墙是否拦了DHCP报文虚拟机配了静态IP后上不了网NAT模式配了桥接网段的IP确认虚拟机的网络模式和IP子网是否匹配访问共享盘提示找不到网络路径防火墙拦了445端口或SMB服务未开启检查防火墙入站规则确认对方电脑共享已启用网页打开极慢但ping节点延迟正常TCP连接建立慢或MTU问题抓包看握手是否有重传检查MTU设置服务器大量TIME_WAIT连接主动关闭连接的高并发场景调整tcp_tw_reuse、tcp_fin_timeout等内核参数或优化应用层连接复用5.2 学习路线和工具建议搜计算机网络的资料很多人会纠结看哪本书。市面上比较主流的几套谢希仁的《计算机网络》是经典教材内容扎实适合期末复习《计算机网络自顶向下》思路清奇从应用层往下讲特别适合初学者建立整体观因为你先知道HTTP是什么、DNS是什么再去看TCP和IP就更容易理解了。湖科大教书匠的课程讲得很细B站能看配套习题的质量也不错适合跟着一步步啃。如果奔着考研408去王道考研的计算机网络讲义重点突出适合应试。工具方面Wireshark是必装的。抓包看三次握手、看HTTP请求响应、看DNS解析过程它能把抽象的协议变成一条条看得见的记录。随手抓一次包看TCP握手时SYN、ACK标志位的变化比背十遍书都印象深刻。命令行里ping、ipconfig、tracert、netstat这四个命令也建议熟练掌握。判断网络通不通用ping查地址配置用ipconfig追踪路径用tracert看端口监听和连接状态用netstat。这四个命令覆盖了日常网络排查80%的场景。5.3 最后说一点我的体会我个人在实际操作中的体会是学网络最忌讳的就是只看不动手。你可以看完这篇文章然后立刻去做三件事第一打开命令行跑一遍ipconfig把里面每个字段都查清楚是什么含义第二开Wireshark抓一次自己的网页访问看看三次握手长什么样第三找一台电脑故意把IP改成和别人冲突感受一下故障现象再把它解决掉。这三件事做完你对IP地址和TCP协议的理解会比干看三个小时书都深。网络这行有个特点知识点是网的不是线的。IP地址、子网掩码、路由、TCP握手、DNS解析它们环环相扣。今天把IP和TCP这两个根扎稳了后面遇到的每一个网络问题都有地方安放。下次再有人问你计算机网络从哪开始学你就可以告诉他先从你电脑的IP地址开始再从一次网页访问的三次握手开始这两扇门推开后面就是一片开阔地。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进