自学嵌入式第27天------TCP和UDP,URL爬虫

1. TCP和UDP区别

**TCP(传输控制协议)UDP(用户数据报协议)**是两种主要的传输层协议,它们在数据传输方式上有显著区别:

  • 连接性

    • TCP是面向连接的协议,通信前需通过三次握手建立连接,通信结束后通过四次挥手断开连接。

    • UDP是无连接的协议,发送数据前无需建立连接,直接发送数据包。

  • 可靠性

    • TCP提供可靠传输,确保数据按序到达,丢失或损坏的数据包会重传。

    • UDP不保证可靠性,数据包可能丢失、重复或乱序。

  • 数据顺序

    • TCP保证数据按发送顺序到达。

    • UDP不保证顺序,数据包可能乱序到达。

  • 速度

    • TCP因连接建立、确认和重传机制,速度较慢。

    • UDP无这些机制,传输速度更快。

  • 头部开销

    • TCP头部较大(20字节),包含序列号、确认号等字段。

    • UDP头部较小(8字节),仅包含基本信息。

  • 适用场景

    • TCP适用于要求可靠传输的场景,如网页浏览、文件传输。

    • UDP适用于实时性要求高的场景,如视频流、在线游戏。

2. TCP和UDP的Socket编写流程

TCP Socket编写流程

  • 服务器端

    1. 创建Socket:socket(AF_INET, SOCK_STREAM, 0)

    2. 绑定地址:bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))

    3. 监听连接:listen(sockfd, backlog)

    4. 接受连接:accept(sockfd, (struct sockaddr*)&cliaddr, &clilen)

    5. 读写数据:read()write()

    6. 关闭Socket:close(sockfd)

  • 客户端

    1. 创建Socket:socket(AF_INET, SOCK_STREAM, 0)

    2. 连接服务器:connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))

    3. 读写数据:read()write()

    4. 关闭Socket:close(sockfd)

UDP Socket编写流程

  • 服务器端

    1. 创建Socket:socket(AF_INET, SOCK_DGRAM, 0)

    2. 绑定地址:bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))

    3. 接收数据:recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&cliaddr, &clilen)

    4. 发送数据:sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&cliaddr, clilen)

    5. 关闭Socket:close(sockfd)

  • 客户端

    1. 创建Socket:socket(AF_INET, SOCK_DGRAM, 0)

    2. 发送数据:sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&servaddr, sizeof(servaddr))

    3. 接收数据:recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL)

    4. 关闭Socket:close(sockfd)

3. TCP为什么安全可靠

TCP的安全可靠性源于以下机制:

  • 三次握手:确保连接建立时双方都准备好通信。

  • 数据包确认与重传:接收方确认收到的数据包,发送方未收到确认则重传。

  • 数据包排序:TCP通过序列号保证数据按序到达。

  • 流量控制:通过滑动窗口机制防止接收方缓冲区溢出。

  • 拥塞控制:通过拥塞窗口和慢启动机制避免网络拥塞。

4. TCP机制

TCP的核心机制包括:

  • 三次握手:建立连接时,客户端和服务器交换SYN和ACK包。

  • 四次挥手:断开连接时,双方交换FIN和ACK包。

  • 数据包确认与重传:接收方确认数据包,发送方未收到确认则重传。

  • 滑动窗口:控制发送方发送数据的速率,防止接收方缓冲区溢出。

  • 拥塞控制:通过慢启动、拥塞避免等算法防止网络拥塞。


TCP(传输控制协议)通过多种机制来保证数据传输的可靠性、效率和流量控制。以下是这些机制的详细解释:


1. 应答机制(Acknowledgment Mechanism)

  • 作用:确保数据包被成功接收。

  • 原理

    • 接收方收到数据后,会向发送方发送一个ACK(确认应答),ACK中包含已成功接收的数据包的序列号。

    • 发送方根据ACK确认数据已成功送达,若未收到ACK,则触发重传机制。

  • 特点

    • 确认的是连续数据的最后一个字节的序列号。

    • 例如,发送方发送序列号为1-1000的数据,接收方收到后会发送ACK=1001,表示期望接收下一个序列号为1001的数据。


2. 超时重传机制(Retransmission Timeout Mechanism)

  • 作用:解决数据包丢失或ACK丢失的问题。

  • 原理

    • 发送方发送数据后启动一个定时器,若在超时时间内未收到ACK,则认为数据包丢失,触发重传。

    • 超时时间(RTO, Retransmission Timeout)是动态计算的,基于网络往返时间(RTT)。

  • 特点

    • 超时重传是TCP可靠性的核心机制之一。

    • 如果多次重传失败,TCP会断开连接。


3. 流量控制机制(Flow Control Mechanism)

  • 作用:防止发送方发送数据过快,导致接收方缓冲区溢出。

  • 原理

    • 接收方通过窗口大小字段(Window Size)告知发送方其缓冲区剩余空间。

    • 发送方根据窗口大小调整发送数据的速率。

  • 特点

    • 窗口大小为0时,发送方会暂停发送,直到接收方通知有可用缓冲区空间。

    • 通过滑动窗口实现动态调整。


4. 滑动窗口机制(Sliding Window Mechanism)

  • 作用:提高数据传输效率,允许发送方在未收到ACK的情况下连续发送多个数据包。

  • 原理

    • 发送方和接收方各自维护一个窗口,窗口大小由接收方的缓冲区空间决定。

    • 发送方窗口内的数据可以连续发送,无需等待ACK。

    • 接收方确认数据后,窗口向前滑动,发送方可以发送新的数据。

  • 特点

    • 滑动窗口大小是动态调整的,受流量控制和拥塞控制影响。

    • 支持累计确认,即ACK确认的是连续数据的最后一个字节。


5. 延时应答机制(Delayed Acknowledgment Mechanism)

  • 作用:减少ACK的数量,提高网络利用率。

  • 原理

    • 接收方收到数据后,不立即发送ACK,而是等待一段时间(通常为200ms)。

    • 如果在等待期间有数据需要发送给发送方,则可以将ACK捎带在数据包中发送。

  • 特点

    • 减少了单独的ACK包,降低了网络开销。

    • 适用于双向通信场景。


6. 捎带应答机制(Piggybacking Acknowledgment Mechanism)

  • 作用:将ACK信息附加在数据包中发送,减少单独发送ACK的开销。

  • 原理

    • 当接收方需要发送数据给发送方时,可以将ACK信息附加在数据包中一起发送。

    • 例如,A发送数据给B,B在回复数据时,将ACK信息附加在回复的数据包中。

  • 特点

    • 适用于双向通信场景,减少了网络中的小包数量。

    • 提高了网络利用率。


总结

机制 作用 核心原理
应答机制 确认数据接收 接收方发送ACK确认已接收的数据
超时重传机制 解决数据包丢失问题 发送方超时未收到ACK时重传数据
流量控制机制 防止接收方缓冲区溢出 接收方通过窗口大小控制发送方的发送速率
滑动窗口机制 提高数据传输效率 发送方在窗口内连续发送数据,接收方滑动窗口确认数据
延时应答机制 减少ACK数量,提高网络利用率 接收方延迟发送ACK,等待可能的捎带机会
捎带应答机制 减少单独发送ACK的开销 将ACK信息附加在数据包中发送

这些机制共同作用,使得TCP能够在保证可靠性的同时,提高传输效率并适应网络环境的变化。


TCP粘包问题*:

封装自定义数据帧
  • 原理

    • 在每个数据包前添加一个头部,头部包含数据包的长度信息。

    • 接收方先读取头部,获取数据包长度,然后根据长度读取完整的数据包。

相关推荐
深蓝电商API4 小时前
爬虫请求频率控制与模拟人类行为
爬虫
喵手4 小时前
Python爬虫实战:知识挖掘机 - 知乎问答与专栏文章的深度分页采集系统(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集知乎问答与专栏文章·采集知乎数据·采集知乎数据存储sqlite
天荒地老笑话么4 小时前
静态 IP 规划:掩码/网关/DNS 的正确组合
网络·网络协议·tcp/ip·网络安全
禹凕5 小时前
Python编程——进阶知识(多线程)
开发语言·爬虫·python
程序媛徐师姐5 小时前
Python基于爬虫的网络小说数据分析系统【附源码、文档说明】
爬虫·python·python爬虫·网络小说数据分析系统·pytho网络小说数据分析系统·python爬虫网络小说·python爬虫的网络小说数据
jianghua0016 小时前
Python中的简单爬虫
爬虫·python·信息可视化
喵手6 小时前
Python爬虫实战:针对Python官网,精准提取出每一个历史版本的版本号、发布日期以及对应的文档/详情页链接等信息,并最终清洗为标准化的CSV文件!
爬虫·python·爬虫实战·零基础python爬虫教学·python官方数据采集·采集历史版本版本号等信息·导出csv文件
..过云雨6 小时前
多路转接select系统调用详解
网络·网络协议·tcp/ip
其美杰布-富贵-李7 小时前
爬虫中 XPath 使用完全指南
爬虫·xpath
喵手7 小时前
Python爬虫实战:城市停车收费标准自动化采集系统 - 让停车费透明化的技术实践(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·城市停车收费标准·采集城市停车收费数据·采集停车数据csv文件导出