`
wade6
  • 浏览: 274219 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入剖析TCP协议的send与recv

 
阅读更多

转自:http://blog.csdn.net/wjtxt/article/details/6603456

 

深入剖析TCP协议的send与recv

 

 

一、 滑动窗口的概念

        TCP数据包的TCP头部有一个window字段,它主要是用来告诉对方自己能接收多大的数据(注意只有TCP包中的数据部分占用这个空间),这个字段在通信双方建立连接时协商确定,并且在通信过程中不断更新,故取名为滑动窗口。有了这个字段,数据发送方就知道自己该不该发送数据,以及该发多少数据了。TCP协议的流量控制正是通过滑动窗口实现,从而保证通信双方的接收缓冲区不会溢出,数据不会丢失。

由于窗口大小在TCP头部只有16位来表示,所以它的最大值是65536,但是对于一些情况来说需要使用更大的滑动窗口,这时候就要使用扩展的滑动窗口,如光纤高速通信网络,或者是卫星长连接网络,需要窗口尽可能的大。这时会使用扩展的32位的滑动窗口大小。

 

二、 滑动窗口移动规则

        1、窗口合拢:在收到对端数据后,自己确认了数据的正确性,这些数据会被存储到接收缓冲区,等待应用程序获取。但这时候因为已经确认了数据的正确性,需要向对方发送确认响应ACK,又因为这些数据还没有被应用进程取走,这时候便需要进行窗口合拢,缓冲区的窗口左边缘向右滑动。注意响应的ACK序号是对方发送数据包的序号,一个对方发送的序号,可能因为窗口张开会被响应(ACK)多次。

        2、窗口张开:窗口收缩后,应用进程一旦从缓冲区(滑动窗口区或接收缓冲区)中取出数据,TCP的滑动窗口需要进行扩张,这时候窗口的右边缘向右扩张,实际上窗口这是一个环形缓冲区,窗口的右边缘扩张会使用原来被应用进程取走内容的缓冲区。在窗口进行扩张后,需要使用ACK通知对端,这时候ACK的序号依然是上次确认收到包的序号。

        3、窗口收缩,窗口的右边缘向左滑动,称为窗口收缩,HostRequirement RFC强烈建议不要这样做,但TCP必须能够在某一端产生这种情况时进行处理。

 

三、send行为

        默认情况下,send的功能是拷贝指定长度的数据到发送缓冲区,只有当数据被全部拷贝完成后函数才会正确返回,否则进入阻塞状态或等待超时。如果你想修改这种默认行为,将数据直接发送到目标机器,可以将发送缓冲区大小设为0(或通过TCP_NODELAY禁用Nagle算法),这样当send返回时,就表示数据已经正确的、完整的到达了目标机器。注意,这里只表示数据到达目标机器网络缓冲区,并不表示数据已经被对方应用层接收了。

        协议层在数据发送过程中,根据对方的滑动窗口,再结合MSS值共同确定TCP报文中数据段的长度,以确保对方接收缓冲区不会溢出。当本方发送缓冲区尚有数据没有发送,而对方滑动窗口已经为0时,协议层将启动探测机制,即每隔一段时间向对方发送一个字节的数据,时间间隔会从刚开始的30s调整为1分钟,最后稳定在2分钟。这个探测机制不仅可以检测到对方滑动窗口是否变化,同时也可以发现对方是否有异常退出的情况。

        push标志指示接收端应尽快将数据提交给应用层。如果send函数提交的待发送数据量较小,例如小于1460B(参照MSS值确定),那么协议层会将该报文中的TCP头部的push字段置为1;如果待发送的数据量较大,需要拆成多个数据段发送时,协议层只会将最后一个分段报文的TCP头部的push字段置1。

 

四、recv行为

        默认情况下,recv的功能是从接收缓冲区读取(其实就是拷贝)指定长度的数据。如果将接收缓冲区大小设为0,recv将直接从协议缓冲区(滑动窗口区)读取数据,避免了数据从协议缓冲区到接收缓冲区的拷贝。recv返回的条件有两种:

      1. recv函数传入的应用层接收缓冲区已经读满

      2. 协议层接收到push字段为1的TCP报文,此时recv返回值为实际接收的数据长度

        协议层收到TCP数据包后(保存在滑动窗口区),本方的滑动窗口合拢(窗口值减小);当协议层将数据拷贝到接收缓冲区(滑动窗口区—>接收缓冲区),或者应用层调用recv接收数据(接收缓冲区—>应用层缓冲区,滑动窗口区—>应用层缓冲区)后,本方的滑动窗口张开(窗口值增大)。收到数据更新window后,协议层向对方发送ACK确认。

        协议层的数据接收动作完全由发送动作驱动,是一个被动行为。在应用层没有任何干涉行为的情况下(比如recv操作等),协议层能够接收并保存的最大数据大小是窗口大小与接收缓冲区大小之和。Windows系统的窗口大小默认是64K,接收缓冲区默认为8K,所以默认情况下协议层最多能够被动接收并保存72K的数据。

 

分享到:
评论

相关推荐

    python数据分析与可视化-02-socket之send和recv的原理剖析.ev4.rar

    在本教程"python数据分析与可视化-02-socket之send和recv的原理剖析.ev4.rar"中,我们将深入探讨Python如何通过socket库进行网络通信,特别是`send`和`recv`这两个核心函数的使用与原理。 首先,让我们来理解什么是...

    tcp源码分析.pdf

    这些操作对应于系统调用如socket(), connect(), send(), recv()和close()。 深入到内核层面,TCP的核心在于`tcp_prot`结构体,它是TCP协议实现的核心逻辑载体。通过`getprotobyname()`函数可以获取到这个结构体,...

    TCP/IP源码 完整的TCP/IP代码程序

    Winsock提供了与TCP/IP协议族接口的API,如`socket()`用于创建套接字,`bind()`绑定本地端口,`listen()`开始监听连接,`accept()`接受连接请求,`connect()`发起连接,`send()`和`recv()`进行数据收发等。...

    TCP/IP详解 (卷2:实现) -part1 pdf

    《TCP/IP详解 (卷2:实现)》是网络通信领域的一部经典著作,它深入剖析了TCP/IP协议栈的实现细节。本卷主要关注的是如何将理论转化为实践,通过丰富的图例和源代码,帮助读者理解和掌握TCP/IP协议在操作系统中的具体...

    Linux 内核源码剖析- TCP.IP 实现, 樊东东, 莫澜, 上册

    《Linux内核源码剖析- TCP/IP实现》是由樊东东和莫澜合著的一本深入探讨Linux操作系统内核中TCP/IP协议栈实现的专业书籍。这本书的上册主要聚焦于TCP/IP协议在Linux内核中的具体实现细节,帮助读者理解和掌握网络...

    TCP/IP卷2:实现

    书中深入剖析了TCP的滑动窗口机制、拥塞控制算法(如慢启动、快速重传和快速恢复)、三次握手与四次挥手等关键概念。 3. **网络层**:主要关注IP协议,包括IPv4和IPv6。这里会讲解IP地址的分配、子网掩码、路由选择...

    TCP-IP详解卷2:实现-2

    这本书深入剖析了网络协议如何在操作系统层面工作,为读者提供了丰富的理论知识与实践指导。 首先,我们来讨论TCP(传输控制协议)和IP(互联网协议)这两个核心组件。TCP是面向连接的协议,负责提供可靠的数据传输...

    Visual C++网络通信协议分析与应用实现代码(软件开发培训资料)

    本文将深入剖析网络通信协议的基础概念,以及如何利用C++的socket接口实现这些协议。 首先,网络通信协议是互联网上数据交换的规则和标准,包括TCP/IP协议族中的HTTP、FTP、SMTP等。在Visual C++中,我们通常使用...

    嵌入式网络那些事LwIP协议深度剖析与实战演练配套源码

    3. **网络函数接口**:了解并使用LwIP提供的API,如socket()、bind()、listen()、connect()、send()、recv()等,实现网络通信功能。 4. **错误处理**:在编程实践中,务必考虑网络错误情况,如超时、重传、连接断开...

    socket编程基础:应届生C\C++方向笔试面试

    本文将对 Socket 编程的基础知识进行详细的介绍,从 TCP/IP 协议族开始,到 Socket 的概念、分类、基本调用、工作原理和实践应用等方面进行了深入的剖析。 一、TCP/IP 协议族 TCP/IP 协议族是工业标准的协议集,它...

    Linux 网络收发代码详解

    6. **数据收发**:连接建立后,双方可以使用`send()`和`recv()`或`write()`和`read()`函数进行数据交换。注意,TCP是面向连接的,提供可靠传输;而UDP是无连接的,数据传输可能丢失。 7. **关闭连接**:完成通信后...

    mtcp 数据结构详解

    为了更好地理解和利用mTCP的功能特性,本篇将深入剖析mTCP中的关键数据结构。 #### mTCP Manager 结构体(`struct mtcp_manager`) 在mTCP的核心管理部分,`struct mtcp_manager`充当了中心角色,负责管理多个资源...

    linux programming instances网络编程教程 附源代码

    本书通过55个精彩的实例,全面剖析了在Linux下编写网络应用程序的方法,并阐述了网络协议架构和开发规范。为了适应不同读者的需要,本书从最基本的Linux系统操作到网络技术的基本理念,逐步深入至Linux/UNIX下具体的...

    电科技大学通信学院段景山老师 socket编程ppt

    本课件将深入剖析Socket编程的核心概念,帮助学生构建扎实的网络编程基础。 首先,我们要理解什么是Socket。Socket,中文常被称为“套接字”,是操作系统提供的一种进程间通信机制,它允许两个网络上的进程通过TCP/...

    Linux 系统编程(第二版) 带书签目录完整版.rar

    5. **网络编程**:涵盖了套接字API,包括TCP/IP、UDP协议,以及服务器端和客户端的编程实践,如socket、bind、listen、accept、connect、send、recv等函数。 6. **内存管理**:讨论了动态内存分配、释放,以及内存...

    局域网文件传输程序(飞鸽传输)源代码

    本文将对“飞鸽传输”的源代码进行深入剖析,揭示其背后的编程原理和技术细节。 首先,我们来看文件传输的基本原理。在局域网环境中,文件传输通常利用TCP/IP协议栈进行,通过建立Socket连接来实现数据的发送和接收...

    新编Windows_API_参考大全(真正完整版)

    8. **网络编程**:涉及Winsock库,讲解如何使用send、recv、bind、connect等函数进行TCP/IP通信。 9. **错误处理**:讲解如何利用GetLastError和FormatMessage等函数来诊断和处理程序运行中的错误。 10. **调试...

    python使用socket向客户端发送数据的方法.docx

    本文将详细介绍如何使用Python中的`socket`模块向客户端发送数据,并结合具体的代码示例进行深入剖析。 #### 知识点一:Python Socket模块简介 `socket`模块是Python标准库的一部分,它提供了低级别的网络接口,...

    rc-main.rar_remote

    在IT行业中,远程控制技术是不...理解这些知识点,不仅可以帮助我们深入剖析rc-main.c的代码,还能为开发或维护类似的远程控制模块提供理论基础。通过学习和实践,我们可以提升在Linux系统管理和软件开发上的专业技能。

    UNIX环境高级编程 超清晰电子书

    6. **网络编程**:详细讲解了TCP/IP协议栈,包括套接字API的使用,如`socket()`, `bind()`, `listen()`, `accept()`, `connect()`, `send()`, `recv()`等,以及并发服务器的设计与实现。 7. **多线程编程**:介绍...

Global site tag (gtag.js) - Google Analytics