| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> Linux_网络_传输层协议 TCP/UDP(端口,报头,协议格式,通信细节,三次握手与四次挥手,TCP协议机制,连接管理机制) -> 正文阅读 |
|
[网络协议]Linux_网络_传输层协议 TCP/UDP(端口,报头,协议格式,通信细节,三次握手与四次挥手,TCP协议机制,连接管理机制) |
紧跟网络应用层协议 文章目录端口数据经过网络传输到主机后,系统根据端口号确认数据给那个应用程序。 端口存在与传输层,使用端口与应用层关系。在传输层的协议报头中可以看到 端口号标记了一个主机上进行通信的不同程序 在TCP/IP协议中使用源IP,源端口号,目的IP,目的端口号来标识一个通信(netstat -n)。 端口号的范围
注意:
㈠ UPD协议(用户数据报协议)UDP在向上交付数据时,只将有效载荷数据交给上层,报头信息不上交 1. UDP协议格式
注意: UDP实现报头与有效载荷分离:
UDP将有效载荷传递给上层的协议:
UDP 报头:
eg:UDP报头类型
传输层通过端口找到对应进程:
2. UDP通信特点与缓冲区
注意: 在UDP报头中16位最大长度,说明UDP报文最大为64K。如果要传输的数据大于64K时,需要在应用层手动分包,多次发送,并在对端进行组合。 ㈡ TCP协议(传输控制协议)TCP相比于UDP来讲保证了可靠性,但可靠意味着要做更多的工作。所以TCP相比于UDP要复杂,保证可靠的成本比较高。 1. TCP协议格式可以看到TCP协议报头的大小为20字节。与UDP报头相同,TCP报头也是通过结构体的位断来实现的。 数据从应用层拷贝到内核,内核加上TCP报头后交给下层传输到对端。 注意: 报头与有效载荷分离:
TCP将有效载荷交给上层协议:
2. TCP可靠性的体现(确认应答机制,序号与确认序号,超时重传机制)确认应答机制: 对于信息传输来讲可靠性体现在: 当信息A传输到对端,对端有响应B传回。就证明信息A传输时可靠的。 TCP为了保证通信可靠性。一般来讲,发送的数据都会有响应。这种策略在TCP中称为确认应答方式
TCP将每个字节的数据都进行了编号如下图 32位确认序号:发送报文的末端序列号+1,告知对方发送报文的末端序列号前的数据已经收到,下次发送从发送报文的末端序列号+1处开始发送 超时重传机制下边介绍 TCP接收到报文时报文顺序可能会打乱 设1号TCP报文A(1-1001),2号报文B(1002-2002),3号报文C(2003-3003) 服务器此时已经收到A报文,又收到报文C。根据A报文大小推算32位确认序号是1002,和C报文的起始序号对不上,说明丢包。服务器响应TCP报文中的确认序号任然是1002,这样客户端会将报文B重新再传一次。保证了数据的连续性。 3. TCP报文成员分析
6位保留字段: 保留指的是这些字段还未使用,未来可能会使用。 16位窗口大小:(流量控制) TCP传输数据时,为了保证数据的可靠性,TCP在内部存在发送和接受缓冲区。 在TCP缓冲区中进行报文重排(数据有序性),上层来不及读取的报文暂时保存在接受缓冲区中等等。 可能客户端网络条件好,发送数据的速度特别快,而服务器拿取数据比较慢。此时接受缓冲区的数据会堆积。 16位窗口大小就是其中的保护措施。 16位窗口中填写的是本机的接受缓冲区中剩余空间的大小。在接受到对端的报文时,根据确认应答机制将缓冲区中剩余空间的大小通过响应告知对端,当接近为0时对端就会停止发送报文,避免了上述问题。 16位校验和: 服务器可能会接受许多报文,这些报文的目的可能不同,TCP报文的目的就是保留字段后6个 ⑴SYNTCP是面向链接的,在通信前客户端与服务器需要发送建立链接报文。此外客户端与服务器断开链接时还需要发送断开连接报文。 ⑵ACKACK位被设置为1时,称为确认报文。 ①三次握手建立连接eg: 上述过程属于通信细节,在双方系统中,上层不需关心。 套接字中: ⑶FINFIN标志位设置为1,称为断开连接报文 ②四次挥手断开连接eg: TCP是全双工的。如果客户端与服务器都断开连接,两端都要向对端申请断开连接 ③建立连接与断开连接通常情况下:客户端与服务器之间的数量比为1:n,系统中通常有多个连接要处理。 Linux操作系统用结构体描述连接属性,通过链表的方法管理多条连接。 建立连接: 断开连接: ⑷URG与16位紧急指针根据上文可知,TCP发送消息,对端接受顺序是按顺序的。 同样通常情况下:数据在接受端读取时也是按顺序读取的。 但如果后面的报文比较重要,需要优先被上层读取的话就需要URG与紧急指针。 URG标志位设为1,代表这个报文需要考虑16位紧急指针,否则会自动忽略。 eg: ⑸PSH根据上文: 当上层取接受缓冲区时特别慢时,接受缓冲区长时间处于满状态。对端发送端长时间等待。 此时发送端发送报文,并将PSH设置为1,代表要求接收端尽快将缓冲区的内容交给上层。 缓冲区中存在字段recv_low_water。当缓冲区数据超过recv_low_water时再通知上层读取。PSH设置为1代表取消recv_low_water限制,即便没有超过也通知上层读取 ⑹RST建立连接是三次握手,但在建立连接时可能会失败。因为三次握手最后一次应答不能确认是否对端收到。
此后客户端向服务器发送数据时,服务器认为没有建立连接,但却接受到信息。此时服务器向客户端发送RST报文,让客户端重新建立连接
㈢ TCP协议机制1. 确认应答机制上文TCP可靠性哪里已经介绍,不在赘述 2. 超时重传机制超时重传机制是在TCP代码中实现的 有两种情况:
当接受端丢包时,发送端没有收到应答,发送端一段时间后进行重传
发送端没有收到应答,发送端还要重发一次报文。 Linux下TCP为了保证效率,每次重传的时间都是500ms的整数倍。达到一定重传次数时强制关闭连接。 3. TCP连接管理机制与状态为什么建立连接是三次握手? 建立连接三次握手与对应状态图: SYN与SYN+ACK:确认了客户端可以向服务器发送接受数据。 SYN+ACK与ACK:确认了服务器可以向客户但接受发送数据。 所以
为什么断开连接是四次挥手 首先,断开连接不需要再确认双方是否能通信,因为前一直在通信。 断开连接图与对应状态 所以 同理因为TCP是全双工的,所以还需要服务器断开连接 所以断开连接是四次挥手 注意:
观察四次挥手CLOSE_WAIT 与TIME_WAIT状态 以及连续重启服务器bind错误本地测试
解决方法:
根据上述可得: |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:44:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |