网络学习-TCP协议(七)

一、TCP协议

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

1、三次握手

在这里插入图片描述

客户端:
1、先发起连接,发送SYN置1,seqnum=12345(随机值)----半连接建立,形成syn队列

服务端:
1、收到SYN,分配tcp控制块
2、发送ack置1,acknum=12346, syn,seqnum=34531(随机值)

客户端:
2、发送ack,acknum=34532 ,seqnum=12346(从之前的序列号+1) ----半连接转为全连接,进入accept队列

小结:

可见在TCP协议中,服务端是被动连接。

2、四次挥手

注意只有主动方和被动方:

1、主动发起断开连接,发送FIN置1,seqnum=1234(随机值)
2、被动方收到FIN,发送ack置1,acknum=1235(seq+1)
3、被动方发送FIN,seqnum=5678(随机值)
4、主动方收到FIN,发送ack置1,acknum=5679(seq+1)

3、TCP的格式

在这里插入图片描述

首部开销最小20字节,最大60字节

4、网络协议栈

在这里插入图片描述

应用层:http,ftp,ssh
传输层:TCP,UDP
网络层:IP,ICMP

5、TCP发生在哪些函数中:

通过对网络I/O的学习,发现无论使用select,poll,还是epoll,都没看见TCP/UDP的相关字眼,那电脑是如何判断使用哪种协议来实现连接的?
回顾之前代码,主要使用了socket()bind(), listen(), accept(), connect(), send(), recv(), **close()**这几个函数。

  • 这些函数是如何实现TCP连接的?
  • 这些函数编译生成的执行文件,为什么在不同系统平台可以正常运行?

二、POSIX API

1、什么是POSIX API?

  • 是一套可移植操作系统接口标准,旨在使应用程序可以在多种UNIX和类UNIX操作系统上运行而无需修改。
  • 像之前使用的socket()bind(), listen(), accept(), connect(), send(), recv(), close()fcntl()select,poll,epoll等函数,都是POSIX API的一部分。

2、三次握手的过程,发送在哪些函数里面:

  • 客户端:
    client:
    Connet()

  • server:
    listen();
    accept();

3、API简介

1. socket()

int socket(int domain, int type, int protocol);
/*
*socket英文单词的本意是插座,在网络编程中,socket代表网络IO的建立,实质是(fd,tcp控制块--stream)
*功能:
*分配fd,bitmap
*tcp控制块的分配
*domain:通信协议族,AF_INET, AF_UNIX,AF_INET6,大部分都是基于IPV4的网络通信,通常使用AF_INET
*type:指定套接字类型,SOCK_STREAM(字节流)---TCP协议,SOCK_DGRAM(报文)---UDP协议,SOCK_RAW---原始套接字
*protocol:指定具体的协议,通常为0。前两个参数确定了,第三个参数通常为0,由内核自动选择合适的协议
*返回值:成功返回非负文件描述符,失败返回-1
*/

2. bind()

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
/*
1、绑定固定ip,port
2、还未到tcp建立过程
3、属于设置过程
返回值:成功返回0,失败返回-1
*/

3. listen()

int listen(int sockfd, int backlog);
/*
1、设置监听,等待客户端连接
2、backlog:半连接队列的大小(内核参数,默认值5)
3、TCP开始建立
返回值:成功返回0,失败返回-1
实质:
1、把TCP的status设置为TCP_STATUS_LISTEN
2、如果不设置,强行连接,会被拒绝
3、设置tcp全连接队列和半连接队列tcp->syn_queuetcp->accept_queue
*/

4. accept()

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
/*
1、阻塞等待客户端的连接请求
2、属于建立TCP的完成后
返回值:成功返回非负文件描述符,失败返回-1
实质:
分配fd给客户端,并把客户端的fd和tcp控制块绑定EPOLLLT:水平触发
只要有事件就绪就会一直通知EPOLLET:边缘触发
只有当事件发生时才会通知一次
避免不能及时响应需要额外添加while循环进行处理
while(1){fd = accept(listenfd, NULL, NULL);if(fd < 0) {break;}
}
*/

5. connect()

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
/*
1、主动发起tcp连接
2、属于建立TCP的过程
返回值:成功返回0,失败返回-1
*/

6. send()

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
/*
flags:用于指定发送数据的特殊选项,如MSG_DONTWAIT,非阻塞模式,一般默认为0
1、发送数据到对方
2、属于传输层
返回值:成功返回发送的字节数,失败返回-1
实质:
将数据从用户空间拷贝到内核缓冲区,然后通过网络发送到对方的内核缓冲区(协议栈),异步操作
*/ssize_t write(int fd, const void *buf, size_t count);
/*
1、发送数据到对方
返回值:成功返回发送的字节数,失败返回-1
相比于send,少了一个flags参数,其余相同,send是POSIX API,write是标准C库函数
如果是网络编程,推荐使用send,因为send可以指定flags参数
*/

7. recv()

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
/*
flags:用于指定接收数据的特殊选项,如MSG_WAITALL,阻塞直到所有数据都收到
1、接收数据
2、属于传输层
返回值:成功返回接收的字节数,失败返回-1
实质:
将对方内核缓冲区的数据拷贝到用户空间缓冲区,异步操作
*/
ssize_t read(int fd, void *buf, size_t count);
/*
1、接收数据
返回值:成功返回接收的字节数,失败返回-1
相比于recv,少了一个flags参数,其余相同,recv是POSIX API,read是标准C库函数
如果是网络编程,推荐使用recv,因为recv可以指定flags参数
*/

8. close()

int close(int fd);
/*
1、关闭fd,释放bitmap位图资源
2、如果是TCP连接,会发送fin包给对方,等待对方的ack包
3、如果是UDP连接,直接释放资源
返回值:成功返回0,失败返回-1
实质:
回收fd,释放bitmap位图资源
如果是tcp连接,发送fin包给对方,等待对方的ack包
如果是udp连接,直接释放资源
*/int shutdown(int sockfd, int howto);
/*
howto:用于指定关闭哪一部分连接,SHUT_RD(关闭读),SHUT_WR(关闭写),SHUT_RDWR(同时关闭读写)
1、关闭fd,释放bitmap位图资源
2、如果是TCP连接,可以指定只关闭读或者写
返回值:成功返回0,失败返回-1
实质:
回收fd,释放bitmap位图资源
如果是tcp连接,可以选择只关闭读或者写
不推荐使用,关闭连接就关闭了,使用shutdown,还只关闭一部分连接,容易引起混乱
*/

三、总结

1、在TCP传输过程中,服务端属于被动连接,客户端属于主动发起连接。

2、对于不同的系统平台,使用了POSIX API,可以实现跨平台网络编程。

四、拓展问题

1、tcp连接的生命周期从什么时候开始?

tcp连接的生命周期是从三次握手开始,到四次挥手结束。即客户端调用connect()开始,到服务端调用close()结束。

2、第三次握手数据包,如何从半连接队列查找匹配的节点

源端口,目的端口,源ip,目的ip

3、syn泛洪攻击

  • 定义:
    syn泛洪攻击是一种常见的网络攻击手段,其目的是通过发送大量的TCP连接请求(SYN包),耗尽服务器的资源,从而阻止合法的用户建立正常的TCP连接。
  • 解决方案:
    早期系统版本,通过listen(fd, backlog)第二个参数,控制半连接队列的大小
    然后是将半连接队列的大小设置为syn+accept队列总长度,放未分配fd的tcb的数量
    现在大部分系统是将半连接队列的大小设置为accept队列长度

4、为什么建立连接需要三次握手,而断开连接需要四次挥手?

  • 三次握手:
    为了实现数据的可靠性传输;TCP通信协议双方,都必须维护一个序列号,以标识发送出去的数据包,哪些是已经被对方收到。实质上是通信双方相互告知序列号的起始值,并确认对方已经收到了这个序列号。如果是两次握手,至多只有连接发起方的序列号能被确认,而另一方的序列号无法被确认。
  • 四次挥手:
    为了保证数据完整性,TCP协议需要通过四次挥手来正确关闭连接。主动方发送FIN包后,被动方需要先回复ACK确认收到,然后再发送自己的FIN包给主动方,最后等待主动方的ACK确认收到后才真正断开连接。这样可以确保双方都能够正确地关闭连接,避免数据丢失

5、accept发生在三次握手的哪一步

发生在第三次握手之后,TCP建立完成之后。

6、TCP是如何保证顺序的?

通过序列号、确认应答、重传机制、滑动窗口和拥塞控制等多种机制来保证数据的顺序性。

7、ack没有收到,先收到fin怎么办?

继续发ack

8、双方调用close会发生什么?

结论:服务端会出现大量的TIME_WAIT状态

  • ​双方发送FIN报文,都进入FIN_WAIT_1状态
  • ​双方收到FIN并发送ACK,都进入closing状态
  • ​双方收到ACK并进入TIME_WAIT状态,等待2MSL(最大段生存时间)以确保对方收到ACK。
  • ​连接完全关闭,2MSL超时后,双方都进入CLOSED状态,连接完全关闭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/81944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python 基础与实战】从基础语法到项目应用的全流程解析

&#xff08;1&#xff09;列表和元组的区别是什么?如何从列表创建元组?如何从元组创建列表? 列表和元组的区别&#xff1a; 可变性&#xff1a;列表是可变的&#xff0c;即可以对列表进行元素的增、删、改操作。例如&#xff0c;可以使用append()方法添加元素&#xff0c;r…

Docker部署Zookeeper集群

简介 ZooKeeper 是一个开源的分布式协调服务&#xff0c;由 Apache 软件基金会开发和维护。它主要用于管理和协调分布式系统中的多个节点&#xff0c;以解决分布式环境下的常见问题&#xff0c;如配置管理、服务发现、分布式锁等。ZooKeeper 提供了一种可靠的机制&#xff0c;…

【学习笔记】Sophus (Python) 使用文档

以下是一份针对 Sophus 库的 Python 使用文档&#xff0c;涵盖基础概念、安装方法、核心功能及代码示例。内容围绕 SO3&#xff08;3D旋转群&#xff09;和 SE3&#xff08;3D刚体变换群&#xff09;展开&#xff0c;适合机器人学、SLAM、三维几何等领域。 Sophus (Python) 使用…

计算机图形学:(三)MVP变换扩展

Three.js WebGL允许把JavaScript和OpenGL 结合在一起运用&#xff0c;但使用WebGL原生的API来写3D程序非常的复杂&#xff0c;同时需要相对较多的数学知识&#xff0c;对于前端开发者来说学习成本非常高。 Three.js是基于webGL的封装的一个易于使用且轻量级的3D库&#xff0c;T…

MySQL数据库操作合集

一、SQL通用语法 ①SQL语句可以单行或多行书写&#xff0c;以分号结尾。 ②SQL语句可以使用空格/缩进来增强语句可读性。 ③MySQL数据库的SQL语句不区分大小写&#xff0c;关键字建议使用大写。 ④注释&#xff1a; 单行注释&#xff1a; -- 注释内容 或 # 注释内容&#…

传统工程项目管理与业财一体化管理的区别?

在工程项目管理领域&#xff0c;传统管理模式与新兴的业财一体化管理模式正在形成鲜明对比。随着数字化转型的加速&#xff0c;工程行业对高效、透明、协同的管理需求日益迫切。传统工程项目管理依赖人工操作、分散系统和分模块管理&#xff0c;难以应对复杂项目的全生命周期需…

敦煌网测评从环境搭建到风控应对,精细化运营打造安全测评体系

自养号测评&#xff0c;抢占流量为快速提升产品权重和销量&#xff0c;很多卖家常采用自己养号补单测评的方式&#xff0c;技术搭建需要很多要素 一、硬件参数的关联性 在我们使用设备进行注册或操作账号的过程中&#xff0c;系统会记录下大量的系统与网络参数&#xff0c;其中…

redis Pub/Sub 简介 -16 (PUBLISH、SUBSCRIBE、PSUBSCRIBE)

Redis Pub/Sub 简介&#xff1a;PUBLISH、SUBSCRIBE、PSUBSCRIBE Redis Pub/Sub 是一种强大的消息传递范例&#xff0c;可在应用程序的不同部分之间实现实时通信。它是构建可扩展和响应式系统的基石&#xff0c;允许组件在没有直接依赖的情况下进行交互。本章将全面介绍 Redis…

JavaSE核心知识点03高级特性03-01(集合框架)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点03高级特性03-01&#xff0…

日志分析-IIS日志分析

环境准备 https://xj.edisec.net/challenges/115 题目要求 windows系统中才有的IIS服务 既然是windows平台&#xff0c;当然需要rdp登录&#xff0c;在ssh登录失败 解题过程 phpstudy--2018站点日志.(.log文件)所在路径&#xff0c;提供绝对路径 Windows服务的日志一般有固定…

一、web安全基础入门

1、Windows命令 文件和目录操作 dir&#xff1a;列出当前目录下的文件和子目录。cd&#xff1a;切换目录&#xff0c;例如 cd C:\Users 切换到C盘的Users目录。md 或 mkdir&#xff1a;创建新目录&#xff0c;如 md testdir。rd 或 rmdir&#xff1a;删除空目录&#xff0c;例…

动态规划应用场景 + 代表题目清单(模板加上套路加上题单)

1. 序列型DP&#xff08;Sequence DP&#xff09; ✅ 应用场景 单个或多个序列&#xff08;数组/字符串&#xff09;&#xff0c;求最优子结构。 常见问题&#xff1a;最长递增子序列、最长公共子序列、回文子序列。 &#x1f9e0; 套路总结 单序列&#xff1a;dp[i] max(…

Linux iSCSI存储共享实验指南

实验介绍 1、在Linux平台上通过iSCSI协议实现IP-SAN存储共享 2、掌握存储导出(export)和存储导入(import)的配置方法 3、学习iSCSI存储的发现、连接、断开和管理操作 1、实验环境 两台同网段的Linux虚拟机&#xff08;无需物理交换机&#xff09; 操作系统&#xff1a;Lin…

从 Docker 到 runC

从 Docker 到 runC:容器底层原理详解 目录 1. Docker 与 runC 的关系 2. Docker 的核心组件 3. runC 的核心功能 4. 实战示例:从 Docker 到 runC 4.1 示例场景:运行一个简单容器 4.2 Docker 底层调用 runC 的流程 4.3 查看 runC 的调用 4.4 直接调用 runC 创建容器 …

使用Python在PowerPoint中插入形状(Shape)

在进行演示文稿设计时&#xff0c;形状&#xff08;Shape&#xff09;不仅可以增强视觉效果&#xff0c;还可以用于展示流程图、标注、数据图示等。借助Python&#xff0c;我们可以通过代码快速批量地在PPT中添加各种形状&#xff0c;提升设计效率。本文将介绍如何使用Python向…

Windows系统下MySQL 8.4.5压缩包安装详细教程

一、MySQL 8.4.5新特性概览 相较于旧版本&#xff0c;MySQL 8.4.5在性能与功能上实现了显著提升&#xff1a; 性能优化&#xff1a;官方测试显示&#xff0c;在高并发场景下&#xff0c;其读写性能较5.7版本提升近2倍&#xff0c;尤其在处理热点数据竞争问题时表现更为出色。…

深度解析Vue项目Webpack打包分包策略 从基础配置到高级优化,全面掌握性能优化核心技巧

深度解析Vue项目Webpack打包分包策略 从基础配置到高级优化&#xff0c;全面掌握性能优化核心技巧 一、分包核心价值与基本原理 1.1 为什么需要分包 首屏加载优化&#xff1a;减少主包体积&#xff0c;提升TTI&#xff08;Time to Interactive&#xff09;缓存利用率提升&am…

【昇腾开发者训练营:Dify大模型部署实战】MindIE + Dify + DeepSeek + Embedding模型 + Rerank模型

文章目录 部署 Dify1. Dify 适配 ARM2. 安装 docker3. 启动 Dify MindIEDify 实操手册1. 基础环境搭建1.1 环境检查1.2 下载模型权重1.3 获取MindIE镜像 2. 启动容器3. 纯模型推理测试3.1 纯模型对话测试3.2 性能测试 4. 服务化部署4.1 MindIE 配置4.2 MindIE 服务化4.3 发起测…

塔能高温冰蓄冷技术:工厂能耗精准节能的创新之路

在工厂的能耗构成中&#xff0c;制冷系统是重要的耗能环节。传统的水蓄冷和冰蓄冷技术在实际应用中存在一些局限性&#xff0c;难以满足工厂对节能和成本控制的更高要求。塔能科技的高温冰蓄冷技术&#xff0c;凭借其独特的优势&#xff0c;为工厂能耗精准节能提供了创新的解决…

通过现代数学语言重构《道德经》核心概念体系,形成一个兼具形式化与启发性的理论框架

以下是对《道德经》的数学转述尝试&#xff0c;通过现代数学语言重构其核心概念&#xff0c;形成一个兼具形式化与启发性的理论框架&#xff1a; 0. 基础公理体系 定义&#xff1a; 《道德经》是一个动态宇宙模型 U(D,V,Φ)&#xff0c;其中&#xff1a; D 为“道”的无限维…