首先,TCP模块会检查收到的包对应哪一个socket。在服务器端,可能有多个已连接的socket对应同一个端口号,因此仅根据接收方端口号无法找到特定的套接字。这时我们需要根据IP头部中的发送方IP地址和接收方IP地址,以及TCP头部中的接收方端口号和发送方端口号共4种信息,找到上述4种信息全部匹配的socket。

找到4种信息全部匹配的套接字之后,TCP模块会对比该套接字中保存的数据收发状态和收到的包的TCP头部中的信息是否匹配,以确定数据收发操作是否正常。具体来说,就是根据套接字中保存的上一个序号和数据长度计算下一个序号,并检查与收到的包的TCP头部中的序号是否一致[插图]。如果两者一致,就说明包正常到达了服务器,没有丢失。这时,TCP模块会从包中提出数据,并存放到接收缓冲区中,与上次收到的数据块连接起来。这样一来,数据就被还原成分包之前的状态了[插图]

当收到的数据进入接收缓冲区后,TCP模块就会生成确认应答的TCP头部,并根据接收包的序号和数据长度计算出ACK号,然后委托IP模块发送给客户端。

收到的数据块进入接收缓冲区,意味着数据包接收的操作告一段落了。接下来,应用程序会调用Socket库的read(图6.7③)来获取收到的数据,这时数据会被转交给应用程序。如果应用程序不来获取数据,则数据会被一直保存在缓冲区中,但一般来说,应用程序会在数据到达之前调用read等待数据到达,在这种情况下,TCP模块在完成接收操作的同时,就会执行将数据转交给应用程序的操作。

然后,控制流程会转移到服务器程序,对收到的数据进行处理,也就是检查HTTP请求消息的内容,并根据请求的内容向浏览器返回相应的数据。这一部分已经超出了TCP模块的范围,我们将在稍后探索服务器程序内部时进行介绍。

收到数据包时,TCP模块会

(1)根据收到的包的发送方IP地址、发送方端口号、接收方IP地址、接收方端口号找到相对应的套接字;
(2)将数据块拼合起来并保存在接收缓冲区中;
(3)向客户端返回ACK。

TCP模块如何处理数据包相关推荐

  1. TCP模块如何处理连接包

    当TCP头部中的控制位SYN为1时,表示这是一个发起连接的包(图6.7①).这时,TCP模块会执行接受连接的操作,不过在此之前,需要先检查包的接收方端口号,并确认在该端口上有没有与接收方端口号相同且正 ...

  2. 【转】TCP、UDP数据包大小的限制

    [转]TCP.UDP数据包大小的限制 来自:https://blog.csdn.net/caoshangpa/article/details/51530685 1.概述 首先要看TCP/IP协议,涉及 ...

  3. TCP,UDP数据包的大小以及MTU

    TCP.UDP数据包大小的确定 UDP和TCP协议利用端口号实现多项应用同时发送和接收数据.数据通过源端口发送出去,通过目标端口接收.有的网络应用只能使用预留或注册的静态端口:而另外一些网络应用则可以 ...

  4. TCP/IP详解--TCP传输小数据包效率问题

    摘要:当使用TCP传输小型数据包时,程序的设计是相当重要的.如果在设计方案中不对TCP数据包的 延迟应答,Nagle算法,Winsock缓冲作用引起重视,将会严重影响程序的性能.这篇文章讨论了这些 问 ...

  5. (转)探究 TCP 一次数据包最大负载,上限真的是 65495 byte 吗

    最近在玩wireshark抓包,抓了一下文件上传,发现有的数据包达到了16312byte,于是产生了一个疑问一个数据包最大负载能达到多少? 查了一通资料,找到了65495byte这个数字,这个数字有什 ...

  6. IP、TCP、UDP数据包长度问题

      IP数据包长度问题总结 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或U ...

  7. java tcp数据包_java tcp封装成数据包【相关词_ tcp数据包处理java】

    2-1.数据序号32位,TCP为发送的每一个字节都编一个号码,这里存储当前数据包数据第一 包括 网络编程结构数据JavaTCPIP的信息,所有JAVA网络编程:TCP/IP数据包结构相关内 Java实 ...

  8. TCP,UDP发送数据包大小浅析

    MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小 ...

  9. TCP、UDP数据包大小的问题

    在进行UDP编程的时候,由于发送的内容大小不固定,那么一次发送多少bytes比较好? 以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的.这个1500字节 ...

最新文章

  1. 残差网络的前世今生与原理 | 赠书
  2. 银行持续交付实战:一个单体系统足以撑起全球大项目
  3. 51nod 最大M子段和系列
  4. java 滚轮页面缩放_急..JAVA 在画布上画拖动滚动条可扩大缩小的长方形
  5. vue中webpack默认配置_Vue-cli 中 Webpack 配置优化(一)
  6. 操作系统的中断,陷阱,异常
  7. Ansible 详解2-Playbook使用
  8. php如果字符串有1 3 5,Day3-php 字符串1
  9. 前端基础进阶(十):面向对象实战之封装拖拽对象
  10. 细数一行代码改变结局的炼丹骚操作
  11. 上线随想之2011-03-26
  12. LinkedIn会成为下一个诺基亚吗?
  13. 小宝机器人的储存容量_扫地机器人和吸尘器哪个更实用?
  14. 20200121每日一句
  15. 实体认证与身份识别概述
  16. 用Qt实现Q-M算法化简逻辑表达式及Qt项目打包发布方法
  17. excel和python建模_如何用Python提高办公(Excel)效率?
  18. post请求302以及post请求变更为get请求的问题排查小记
  19. python3 paramiko 远程执行 ssh 命令、上传文件、下载文件
  20. 【Nginx的学习和搭建】

热门文章

  1. grasshop 犀牛5.0下载_神契幻奇谭 v1.129版发布 快来下载神契幻奇谭2020最新官方版...
  2. linux shell locate,shell学习之locate和find命令
  3. 用Python实现ax²+by的图灵机【形式语言与自动机】
  4. spring相关jar包(Free)
  5. 小米笔记本bios版本大全_初级用户应该学习的BIOS知识
  6. android多个网络请求如何依次执行,Android 并发和串行网络请求
  7. envi栅格TIF数据进行分割_常用水文气象数据读取及其可视化(二进制、HDF5、NetCDF)以GLDAS、MODIS、GSMaP为例...
  8. centos7卸载docker_使用 Docker 部署 Spring Cloud 项目详细步骤
  9. Linux 端口侦听不到,在linux上,如何在不尝试连接的情况下检查端口是否处于侦听状态...
  10. c语言程序设计学习中的问题与对策,C语言程序设计学习中的问题与对策.pdf