▲网络原理(2)-TCP

1.TCP协议结构

TCP头部可变长(20---60B)

头部就是上图除了数据以外的其余部分。

基础长度:16+16+32+32+4+6+6+16+16+16=160bit=20byte

4位首部长度,有无选项

4bit,表示范围0~15,数据单位是4byte,意思是这个字段里写的数字x4=TCP头部粽子节数。最小数字是5

取值为5------》5x4=20字节,没有选项,基础头部

取值为6------》6x4=24字节,原来20字节的基础上,选项部分增加4字节

取值为15------》15x4=60字节,原来20字节的基础上,选项部分增加40字节

保留位(6位)

目前不用,保留以便后续使用

6个标志位

2.TCP特性

有连接,可靠传输,面向字节流,全双工。

可靠传输主要是:虽然不能100%送达消息给对方,但是可以知道对方是否收到。

如果对方收到:传输完成

如果对方没有收到:重传

3.TCP核心机制

1.确认应答机制

第一轮:

假设客户端向服务器发送一个字符串:abc,共3个字节

假设客户端的ISN(Initial Sequence Number)=1000,

每个字节都有独立的编号:a--->1000,b------>1001,c------>1002,

32位序号:客户端发送报文,seq(Sequence Number)=1000,携带数据abc

含义:这个报文里,第一个字节a的编号是1000。seq标记:本段数据第一个字节的编号。

**32位确认序号:**服务器收到abc后,返回ACK(Ackonwledgement Number )=1003

含义:服务器告诉客户端,1003之前的所有字节我全都收到了,下一次希望收到编号为1003的字节。

第二轮:

客户端发送字符串:11q

seq=1003

1------>1003,2------>1004,q------>1005

服务器收到后,返回ack=1006。

2.超时重传机制

丢包有两种情况:1.客户端数据在发送过程中丢包了2.服务器的ack丢包了。

丢包后内核会重传。

但是如果是这样的场景:客户端向服务器发送扣款10000元的请求------》服务器接收后扣除------》服务器向客户端发送ack------》ack丢包

客户端没有收到ack,但是此时理论上客户端不能重传!但实际上客户端不能分清是哪种情况,只要超时时间一到,客户端一定会重传!此时就有了接收缓存区机制避免这种情况。

接收缓存区

服务器和客户端都有一个接收缓存区。

传输的数据包给每个字节都排序,数据到达对方后先进入接收缓存区,在这个区内对:

序号重复的数据去重。服务器收到重复的seq报文,识别出是重复数据,直接丢弃重复报文!

顺序错乱的数据根据序号重新排队。

但是重传是有限度的,如果连续重传多次都没有达到对方------》网络出现严重故障

当重传到达一定次数,发送方认为对方网络故障,放弃当前的TCP连接,把对端的信息删除。

超时时间间隔

随着次数的递增,超时时间间隔逐渐增大

3.确认应答和超时重传是TCP实现可靠传输的最核心机制

4.连接管理

建立和断开连接是操作系统内核完成的过程,应用程序对这两个过程感知有限!

TCP如何建立连接(三次握手handshake)

TCP如何断开连接

相关推荐
9624561 小时前
一次 Dell PowerEdge R750xs 启动故障复盘:从 iDRAC 带外管理到 Linux 多内核回退与 initramfs 重建
linux·运维·服务器
QZ166560951591 小时前
数据库监测的主动防御:实时感知,看见即掌控
网络·安全·网络安全
流浪0011 小时前
计算机网络篇8:传输层——序列化与反序列化,TCP 面向字节流的报文边界由应用层自己切
网络协议·tcp/ip·计算机网络·1024程序员节·序列化反序列化·面向字节流·面向数据包
Percep_gan2 小时前
调用天翼云的对象存储ZOS,很详细
java·1024程序员节
若亦_2 小时前
数据结构>>优先级队列(堆)
java·数据结构
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 查询圈子个人动态:查询我的动态需求分析
java·开发语言·交友
denlaku2 小时前
JDK 23 新特性详解
java
code2cat2 小时前
Java高级篇之Hibernate:让对象映射到表,理解持久化与事务
java·后端·hibernate·1024程序员节
北京中科新远科技2 小时前
高速接口兼容排查实战:OSFP、QSFP112与QSFP56如何逐层验证
linux·运维·网络
Ruiery2 小时前
Linux 6.6内核 CPU 深度解析(零):x86 内核引导协议 — 从 bootloader 到 main()
linux·运维·服务器