TCP协议特性

1.有连接

2.可靠传输

1)确认应答:TCP的确认应答是确保TCP可靠性最核心的机制

主机B收到了 1- 1000 的字节数据后,返回一个应答报文ack,应答报文中确认序号的只就是 1001

a)1001之前的数据都已经收到了

b) 接下来从 1001 开始发送

TCP的确认应答机制是 确保 TCP可靠性的核心机制

2)超时重传----确认应答的补充

网络传输中,丢包是一个普遍的情况,无法预测哪个报文会丢,发送方如果一段时间之内,没有收到ack,就会视为是丢包----触发重传

TCP socket 在内核中有一块 接收缓冲区,发送方发送来的数据,要先放到接收缓冲区中,然后程序调用 scanner方法读取缓冲区,才能读到数据

3)自动去重

接收方如何判断是否是重复数据?

1.如果数据还存在接收缓冲区,还没被读取

此时将收到的数据的序号,和缓冲区终端所有数据的序号一一对应,查看是否有重复的,如果有重复的就可以把新收到的数据丢弃;

2.数据在接收缓冲区,已经被程序读取了

程序读取缓冲区数据时是按照 先后顺序读取的:1-100,101-200,201-300.....

此时如果新收到的数据是 1-100,但已经被读取过了,就会判定这个数据包为重复的包;

超时重传策略

超时是会重传,但重传也不是无限制的重传,

1.重传次数是有上限的,重传到一定程度,还没有收到 ack 就尝试重置连接,如果重置也失败,就直接放弃连接

2.重传的超时时间也不是固定不变的,随着重传次数的增加而增大(重传频率越来越低)

以上是 TCP可靠性传输最核心的机制;

4)连接管理

当主机之间建立TCP连接时,内核时如何建立的呢?

通过"三次握手"建立连接,目的时让通信双方保存对方的信息

syn:数据包,不懈怠载荷,没有应用层的数据,也不代表任何程序的业务逻辑,但是带有IP报头/以太网数据帧帧头/TCP报头,只是一个打招呼的作用----称为"握手";

连接过程:通信双方各自给对方发起一个 syn 各自给对方回应一个 ack(客户端),等所有握手环节完成,服务器才会保存客户端的相关信息

网络传输过程要涉及到多次的 封装 和 分用 ,所以将syn + ack' 合并成一次,成本就降低了

三次握手的意义

1.针对通信路径初步确认一下通信链路是否通畅(可靠性的前提)

2.验证通信双方的发送和接收能力是否正常

为什么必须时三次握手?四次/两次可以吗?

四次可以,但网络IO开销大

两次不可以,服务器不能确认自己和对方的发送和接收功能是否正常;

断开连接,四次挥手

连接本质上,就是让通信双方保存对方的信息,每个客户端/服务器。都要保存很多的对端信息,一旦保存的多了,就需要使用"数据结构"断开连接的本质:把对端的信息从数据结构中删除掉;

四次挥手是建立在双方都同意的基础上,对于单方面强制,就不适用;

socket.close()触发 fin 数据报,通信双方各自给对方发起 fin 再各自给对方发送 ack;四次挥手代表"和平分手"

如果实际通信中,ack 和 第二个 fin 时间间隔比较长 此时就无法合并 fin + ack

四次挥手和三次握手比较

相同点

都是通信双方给对方发送一个 syn/fin,各自给对方返回 ack

不同点

三次握手中间两次一定能合并,四次挥手则不一定

三次挥手必须是 客户端主动,四次挥手--客户端/服务器都可以主动

fin时通过 close 触发的,主动调用,服务器挂了都会触发 四次挥手

连接管理中的 TCP状态转换过程

一.TCP连接状态

LISTEN状态:服务端一创建 serverSocket 并绑定端口,处于监听连接请求状态

ESTABLISHED状态:客户端和服务端 完成 三次握手,连接客户端与服务端已完成握手

二:TCP断开流程状态

服务端主动断开:

1.客户端发 fin -->进入 FIN_WAIT_1;

2.服务端接收 fin -->回复 ack --服务端进入 CLOSE_WAIT,客户端进入 FIN_WAIT_2

3.服务端调用 close()发 FIN-->客户端进入 LAST_ACK

4.客户端收FIN,会ACK-->客户端进入 TIME_WAIT,服务端收 ACK 后进入 CLOSED

5.客户端 TIME_WAIT 超时-->进入CLOSED

滑动窗口

确认应答机制下

每次发送发收到一个 ack 才会发送下一条数据

导致大量的时间都消耗在等待 ack上

为了解决这样上述问题,滑动窗口就可以在保证可靠性传输的基础上,提高效率

引入了滑动窗口,批量发送数据

之前发送了一个数据等待一个ack,才发送下一个数据

现在 先发送一个数据,不等 ack,会继续发送下一条数据

连续发送了一定数据之后,统一等待 ack

只要收到一个 ack 就可以 滑动窗口,继续发送新数据

滑动窗口出现丢包怎么办

1.ack丢失

TCP累计确认机制

1.定义:接收方回复哪一条数据的确认号,就表示该确认好之前的所有数据都已经收到

2.场景:客户端向服务器发送 1-100,101-200,201-300,如果只回复了 201就说明 1-200都收到了;

2.数据丢失

数据丢失时,所有接收到的数据都会存储在 服务器 的缓冲区中,依次拍好,服务器会重复返回丢失的数据 的确认号,当客户端收到好几个相同的确认序号,就知道这一条数据丢失,进行重传,只会索要丢失的数据,这种情况称为 "快速重传"

相关推荐
莫回首�3 小时前
ubuntu 20.04 多网卡配置,遇到问题总结
linux·网络·ubuntu
问简5 小时前
虚拟化对比
服务器
航Hang*6 小时前
Windows Server 配置与管理——第3章:文件系统管理
运维·服务器·windows·vmware
lifewange6 小时前
Linux ps 进程查看命令详解
linux·运维·服务器
功德+n6 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
人工干智能7 小时前
科普:python中你写的模块找不到了——`ModuleNotFoundError`
服务器·python
星辰徐哥7 小时前
5G的行业应用:工业互联网、车联网、智慧医疗中的网络支撑
网络·5g·php
杨云龙UP7 小时前
从0到1快速学会Linux操作系统(基础),这一篇就够了!
linux·运维·服务器·学习·ubuntu·centos·ssh
Dovis(誓平步青云)7 小时前
《Linux 信号入门:搞懂 “进程通信的紧急电话” 到底怎么用(初篇)》
linux·运维·服务器