96SEO 2026-02-19 11:30 23
老规矩#xff0c;分享一段喜欢的文字#xff0c;避免自己成为高知识低文化的工程师#xff1a;

简单#xff0c;单纯#xff0c;喜欢独处#xff0c;独来独往#xff0c;不易合同频过着接地气的生活…我是穿拖鞋的汉子魔都中坚持长期主义的汽车电子工程师。
简单单纯喜欢独处独来独往不易合同频过着接地气的生活除了生存温饱问题之外没有什么过多的欲望表面看起来很高冷内心热情如果你身边有这样灵性的人一定要好好珍惜他们眼中有神有光干净给人感觉很舒服有超强的感知能力有形的无形的感知力很强能感知人的内心变化喜欢独处好静清静享受孤独不打扰别人不喜欢被别人打扰在自己人世界里做着自己喜欢的事。
时间不知不觉中来到新的一年。
2024结束2025开始新的忙碌。
成年人的我也不知道去哪里渡自己的灵魂独自敲击一些文字算是对这段时间做一个记录。
TCP是TCP/IP协议族中一个最核心的协议它向下使用网络层IP协议向上为应用层HTTP、FTP、SMTP、POP3、SSH、Telnet等协议提供支持。
本文给出TCP报文格式的详细说明介绍网络数据包传递中如何进行地址解析、建立TCP连接的三次握手过程以及断开TCP连接的四次挥手过程。
Protocol缩写TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议由国际互联网工程任务组(The
用户数据报协议)而言的。
TCP在开始传输数据前要先经历三次握手建立连接并通过连接一对一发送消息传输结束后通过四次挥手断开连接。
而UDP是无连接的发送方在发送数据之前不需要与接收方建立连接即刻可以传输数据每个UDP数据包都是独立的相互之间没有关联因此UDP可以一对一、一对多或多对多发送消息。
是否可靠也是相对于UDP而言的。
TCP自身有三次握手和超时重传等机制确保数据的可靠传输发送方在发送数据包后会等待接收方发送确认(ACK)消息。
如果发送方在一定时间内未收到确认消息它将假定数据丢失并重新发送数据。
接收方收到重复的数据包时会发送冗余的ACK消息来通知发送方以避免数据丢失。
同时TCP还提供流量控制和拥塞控制以保持网络的稳定性和性能。
因此无论网络如何变化只要不是主机宕机等原因都可以保证一个报文可以到达目标主机。
相对于TCP的可靠传输UDP是不可靠的。
UDP数据包的传输过程中不提供确认、重传、流量控制和拥塞控制等机制因此UDP数据包可能丢失、重复、乱序或损坏。
TCP是面向字节流的传输虽然应用程序和TCP的交互是一次一个数据块(大小不等)但TCP把应用程序看成是一连串的无结构的字节流。
TCP有一个缓冲当应用程序传送的数据块太长TCP就可以把它划分短一些再传送。
如果应用程序一次只发送一个字节TCP也可以等待积累有足够多的字节后再构成报文段发送出去。
与面向字节流相对的是UDP的面向报文。
UDP对应用层交下来的报文既不合并也不拆分而是保留这些报文的边界即应用层交给UDP多长的报文UDP就照样发送一次发送一个报文。
因此应用程序必须选择合适大小的报文。
若报文太长则IP层需要分片降低效率。
若太短会使IP报文太小。
了解报文格式是搞懂一个通信协议的必经之路。
TCP报文由TCP首部(报头)和应用数据构成其中TCP首部是TCP
Port)长度各为16位即2个字节分别指示发送端的应用程序使用的端口号以及接收端的应用程序期望接收的端口号。
它们的长度说明为什么计算机端口的范围是1-65535
(0不使用2^1665536最大位65536不使用)。
有了源端口和目标端口加上IP首部里的源IP和目标IP就可以唯一确定一个连接。
4294967295]。
当序号增加到4294967295后下一个序号将回到0重新开始。
在建立连接时由计算机生成的随机数作为其初始值(ISN即Initial
包传给接收端主机每发送一次数据就累加一次该“数据字节数”的大小。
序列号用来解决网络包乱序问题实现可靠的数据传输和流量控制。
Number)长度为32位只有在ACK标志位被设置时才有效。
它指示期望接收的下一个字节的序列号(所以该字段一般都是上次接收成功的数据字节序号加1)用于确认已经成功接收的数据。
在TCP连接建立后确认号的范围通常是相对于初始序号(ISN)的相对偏移量。
如果ISN的初始值为X那么确认号的范围就是[X1,
X1N-1]其中N表示已经成功接收的字节数。
发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。
确认号的范围是[0,
Offset)长度为4位指示TCP报文的“数据”起始处距离TCP报文起始处的距离有多远以4字节为单位计算出的数据段开始地址的偏移值。
没有选项时该值为5即20字节4位能表示的最大整数是15也就说明TCP报文里数据开始的位置距离报文起点是60个字节(4*15)。
这意味着TCP的首部长度是20-60个字节。
保留(Reserved)长度为3位保留供将来使用目前应设置为零。
控制标志(Flags)长度为9位用于控制和管理TCP连接。
各控制标志位说明如下
Sum)用于支持一种称为ECN-nonce的TCP扩展机制该机制用于增加拥塞控制的安全性防止拥塞控制信息被恶意篡改。
Reduced)用于指示发送方减小拥塞窗口(Congestion
Window)的大小。
CWR标志位通常与拥塞控制机制一起使用以应对网络拥塞的情况。
ECE(ECN-Echo)ECE标志被设置表示发送方支持显式拥塞通知(Explicit
ECN)机制并请求接收方通知其关于网络拥塞的情况。
接收方在收到设置了ECE标志的TCP报文段后如果网络出现拥塞则可以在回复的TCP报文段中设置ECN-Echo标志作为响应。
通过使用ECE标志和ECN-Echo回复TCP连接的发送方和接收方可以共同协调拥塞控制以提高网络的性能和稳定性。
URG(Urgent)指示报文段中包含紧急数据。
当URG1时表明开启了urgent
mode通知接收方在处理数据时要特别注意紧急数据的处理。
URG标志位的设置与紧急指针字段(Urgent
ACK(Acknowledgment)指示确认号字段有效。
仅当ACK1时确认号字段才有效当ACK0时确认号无效。
TCP规定在连接建立后所有的传送的报文段都必须把ACK置为1。
PSH(Push)指示接收方应立即将数据推送给应用程序而不是等待缓冲区填满。
当两个应用进程进行交互式的通信时有时一端的应用进程希望在键入一个命令后立即就能收到对方的响应。
在这种情况下TCP就可以使用推送(push)操作。
这时发送方TCP把PSH置为1并立即创建一个报文段发送出去。
接收方TCP收到PSH1的报文段就尽快地(即“推送”向前)交付接收应用进程。
而不用再等到整个缓存都填满了后再向上交付。
连接中出现异常(如主机崩溃或其他原因)必须强制断开连接然后再重新建立连接进行传输。
RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
SYN(Synchronize)用于建立连接发起连接请求。
在连接建立时用来同步序号。
当SYN1而ACK0时表明这是一个连接请求报文段。
对方若同意建立连接则应在响应的报文段中使SYN1和ACK1因此SYN置为1就表示这是一个连接请求或连接接受报文。
FIN(Finish)用于关闭连接请求终止连接。
当FIN1时表示发送方没有数据要传输了要求释放连接。
Size)长度为16位指示接收方的接收窗口大小用于流量控制最大的窗口大小为2^16-16553564k。
这是早期的设计对于现在的网络应用可能会不太够因此可以在选项里加一个
窗口扩大选项来传输更多的数据。
窗口指的是发送本报文段一方的接受窗口(而不是自己的发送窗口)。
窗口值告诉对方从本报文段首部中的确认号算起接收方目前允许对方发送的数据量(以字节为单位)。
之所以要有这个限制是因为接收方的数据缓存空间是有限的。
总之窗口值作为接收方让发送方设置其发送窗口的依据。
校验和(Checksum)长度为16位用于检测TCP报文段是否在传输过程中发生了错误。
校验和计算包括报头和数据。
Pointer)长度为16位只有在URG标志位被设置时才有效。
它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。
因此在紧急指针指出了紧急数据的末尾在报文段中的位置。
当所有紧急数据都处理完时TCP就告诉应用程序恢复到正常操作。
值得注意的是即使窗口为0时也可以发送紧急数据。
选项(Options)可选字段长度可变最长可达40个字节。
当没有使用“选项”时TCP的首部长度是20字节。
选项字段用于提供额外的功能和控制每个选项的开始是
MSS)占用4字节通常在创建连接而设置SYN标志的数据包中指明这个选项指明本端所能接收的最大长度的报文段。
通常将MSS设置为(MTU-40)字节携带TCP报文段的IP数据报的长度就不会超过MTU(MTU最大长度为1518字节最短为64字节)从而避免本机发生IP分片。
只能出现在同步报文段中否则将被忽略。
Factor)占用3字节取值0-14。
用来把TCP的窗口的值左移的位数使窗口值乘倍。
只能出现在同步报文段中否则将被忽略。
这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节。
TSopt)占用10字节其中最主要的字段是时间戳字段(Timestamp
4字节)。
时间戳选项允许通信的两端在TCP报文段中包含时间戳值以便进行一些时间相关的操作和计算。
Option)用于提供数据完整性和身份验证的功能。
该选项用于对TCP报文段进行保护防止数据篡改和未经授权的访问。
我们在“IP协议详细解析”一文中介绍了IP报头中“源地址”和“目的地址”与本文TCP报头中的“源端口”和“目的端口”共同确定了数据包传递过程中需要的地址如下图所示。
类比日常工作中邮寄信件我们装在信封里的信件相当于要传递的数据标准的信件格式是要在信封上写“收信人地址”和“寄信人地址”相当于IP地址其中“收信人地址”对应数据包里IP报头中的“目的IP地址”“寄信人地址”对应数据包里IP报头中的“源IP地址”写上寄信、收信两个地址就可以保证信件可以邮寄到目的地了。
但信件邮寄到目的地址后由谁来收从上面这封信的收件人地址检索到这个地址是位于上海市浦东新区张江“A公司B部门”的这个部门可能有成百上千人收件人不明确即使把信件送到这个地址也没办法投递到具体的收信人。
因此邮件信件需要填写“收件人姓名”、“收件人地址”和“寄件人姓名”、“寄件人地址”的组合才能保证信件能准确投递到具体的收件人手中。
这里的收信人姓名相当于TCP报头的目的端口寄信人姓名相当于TCP报头的源端口。
对比传递信件我们来看网络数据包传递过程的例子。
位于北京的李四(电脑IP地址:
首先李四电脑将消息打包成TCP数据报后添加IP报头和以太网报头形成网络数据包发送到计算机网络中。
计算机网络通过数据包中IP报头的目的IP地址(114.92.67.193)把该数据包准确传递到张三电脑。
张三电脑收到了李四电脑发送过来的数据包后由于张三电脑上同时运行有多个程序(例如图中的QQ、微信、Foxmail等)虽然张三电脑知道这个数据包是传输给它的但是它不知道该把这个数据包中的数据交给哪个程序。
针对这个问题使用数据包中TCP报头的源端口和目的端口根据不同的程序使用不同端口号来确定应用程序并发送和接受数据这样数据包就能像邮寄信件一样准确投递到具体电脑上指定的程序了。
例如我们指定张三电脑上QQ、微信、Foxmail使用的端口分别是80、8900和110那么当收到数据包里目的端口80就是传输给QQ的。
上述例子还可以引申出数据包结构中的其他字段的作用例如我们收到信后可以简单地通过信封是否完整来检查该信件是否被别人在传输途中拆开并篡改过信件内容。
对于网络数据包TCP报头的“校验和”(Checksum)可以验证收到数据包数据是否在途被别人拆开修改过。
为什么需要建立TCP连接首先IP协议是无连接的IP并不维护任何关于后续数据报的状态信息每个数据报的处理相互独立。
这种无连接的优点是不占用线路降低了对网络线路的要求此外IP协议是不可靠的不能保证IP数据报能成功到达目的地是一种尽力而为的传输服务路由器对IP报文出现错误的处理方式是丢包并发送ICMP(Internet
Protocol互联网控制协议)控制消息给源地址。
因为IP协议是无连接、不可靠的因此需要上层TCP来建立连接和差错重传实现面向连接的、可靠的、基于字节流的传输层通信协议。
由于建立TCP连接的过程需要来回3次所以将这个过程形象的叫做三次握手(Three-Way
Handshake)一旦建立连接两台主机就可以进行全双工的通信。
首先客户端发起连接请求向服务器发送一个SYN(同步)报文段段中包含了目的端口和本机端口设置SYN
Number)为一个随机选择的x即seqx也就是初始序号(Initial
ISN)如果是第一个连接很可能是0。
此时服务器对应的端口要处于监听状态客户端发起请求后进入
报文段对这个SYN报文段进行确认。
服务器向客户端发送一个SYN-ACK报文段作为回应报文段中的标志位设置为SYN1和ACK1表示同时作为确认和同步序号字段设置为服务器的随机选择的初始序号y(服务端的TCP段序号)即seqy确认号字段(Acknowledgment
Number)设置为客户端的初始序号加1即ackx1。
服务器端将上述所有信息放到一个TCP段(即SYNACK段)中一并发送给客户端此时服务器进入SYN_RECV状态。
报文段后要向服务端发送一个ACK(确认)报文段对连接请求的确认进行确认。
报文段中的标志位设置为ACK1确认号字段设置为服务器的初始序号加1即acky1序号字段设置为客户端的初始序号加1即seqx1。
此时客户端进入
三次握手完成之后TCP连接就正式建立起来了双方可以开始进行数据的可靠传输。
三次握手的目的是确保双方的初始序号和确认号的同步并验证双方的可达性。
通过这个过程TCP可以建立一个可靠的双向通信通道在后续的数据传输中保证数据的可靠性和顺序性。
客户端数据发送完成则向服务端发送连接释放请求的FIN报文(请求连接终止FIN1)主动关闭TCP连接。
报文中会指定一个序列号sequ并停止再发送数据但依然能够接收数据。
此时客户端处于
状态等待服务端确认。
TCP规定FIN报文即使不携带数据也要消耗一个序号。
服务端收到FIN报文之后通知相应的高层应用进程告诉它客户端向服务端这个方向的连接已经释放了。
此时服务端向客户端发出连接释放的应答ACK报文并进入了CLOSE_WAIT(关闭等待)状态。
ACK报文头包含ACK1acku1并且带上自己的序列号seqv。
这里acku1是第一次挥手的序列值1表示希望收到从第u1个字节开始的报文段并且已经成功接收了前u个字节。
前两次挥手既让服务端知道了客户端想释放连接也让客户端知道了服务端已了解自己想要释放连接的请求。
如果服务端也想断开连接就向客户端发送连接释放报文。
由于在CLOS_WAIT状态服务端很可能又发送了一些数据假定此时连接释放报文的序列号为seqwack也是取第一次挥手的seq
此时服务端就进入了LAST_ACK(最后确认)状态等待客户端的确认并停止向客户端发送数据但服务端仍能够接收从客户端传输过来的数据。
此时客户端处于TIME_WAIT(时间等待)状态并在这个状态等待
一是为了保证客户端发送的最后一个ACK报文段能够到达服务器端确保服务端能正常进入CLOSED状态。
服务端在
二是为了避免新旧连接混淆。
由于网络滞留客户端可能发送了多次请求建立连接的请求经过时间2MSL就可以使本链接持续时间内所产生的所有报文段都从网络中消失这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback