TCP发送数据流程详解

2023-11-18

B/S通信简述

整个计算机网络的实现体现为协议的实现,TCP/IP协议是Internet的核心协议,HTTP协议是比TCP更高层次的应用层协议。

HTTPHyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。

浏览器(Web Browser)负责与服务器建立连接下载网页(包括资源文件及JS脚本文件)到本地,并最终渲染出页面。JS脚本文件运行在客户端,负责客户端一些行为响应或预处理,例如提交表单前的数据校验、鼠标事件处理等交互。由此可见,浏览器(Browser)一方面充当了C/S通信架构中C角色,另一方面它是HTML/JavaScript解析渲染引擎Analyze Render Engine)。

在浏览器地址栏敲入“http://www.baidu.com/”,按下回车键,浏览器中呈现出百度首页。这样一种情景我们再熟悉不过,本文通过wireshark抓取这一过程的TCP/IP数据包,结合TCP协议分析HTTP通信的基本流程。

MTU和MSS

本文用到的抓包工具为wireshark,它的前身是赫赫有名的Ethereal。wireshark以太网帧的封包格式为:

Frame = Ethernet Header + IP Header + TCP Header + TCP Segment Data

(1)Ethernet Header =14 Byte = Dst Physical Address(6 Byte)+ Src Physical Address(6 Byte)+ Type(2 Byte),以太网帧头以下称之为数据帧。

(2)IP Header =20 Byte(without options field),数据在IP层称为Datagram,分片称为Fragment。

(3)TCP Header = 20 Byte(without options field),数据在TCP层称为Stream,分段称为Segment(UDP中称为Message)。

(4)54个字节后为TCP数据负载部分(Data Portion),即应用层用户数据。

Ethernet Header以下的IP数据报最大传输单位为MTU(Maximum Transmission Unit,Effect of short board),对于大多数使用以太网的局域网来说,MTU=1500。

TCP数据包每次能够传输的最大数据分段为MSS为了达到最佳的传输效能,在建立TCP连接时双方协商MSS值,双方提供的MSS值的最小值为这次连接的最大MSS值。MSS往往基于MTU计算出来,通常MSS=MTU-sizeof(IP Header)-sizeof(TCP Header)=1500-20-20=1460。

这样,数据经过本地TCP层分段后,交给本地IP层,在本地IP层就不需要分片了。但是在下一跳路由(Next Hop)的邻居路由器上可能发生IP分片!因为路由器的网卡的MTU可能小于需要转发的IP数据报的大小。这时候,在路由器上可能发生两种情况:

(1).如果源发送端设置了这个IP数据包可以分片(May Fragment,DF=0),路由器将IP数据报分片后转发。

(2).如果源发送端设置了这个IP数据报不可以分片(Don’t Fragment,DF=1),路由器将IP数据报丢弃,并发送ICMP分片错误消息给源发送端。

关于MTU的探测,参考《Path MTU discovery》。我们可以通过基于ICMP协议的ping命令来探测从本机出发到目标机器上路由上的MTU,详见下文。

TCP和UDP

在基于传输层(TCP/UDP)的应用开发中,为了最后的程序优化,应避免端到端的任何一个节点上出现IP分片。TCP的MSS协商机制加上序列号确认机制,基本上能够保证数据的可靠传输。

UDP协议在IP协议的基础上,只增加了传输层的端口(Source Port+Destination Port)、UDP数据包长(Length = Header+Data)以及检验和(Checksum)。因此,基于UDP开发应用程序时,数据包需要结合IP分片情况考虑。对于以太局域网,往往取UDP数据包长Length<=MTU-sizeof(IP Header)=1480,故UDP数据负载量小于或等于1472(Length-UDP Header);对于公网,ipv4最小MTU为576,UDP数据负载量小于或等于536。

“向外”NAT在内网和公网之间提供了一个“不对称”桥的映射。“向外”NAT在默认情况下只允许向外的session穿越NAT:从外向内的的数据包都会被丢弃掉,除非NAT设备事先已经定义了这些从外向内的数据包是已存在的内网session的一部分。对于一方在LAN,一方在WAN的UDP通信,鉴于UDP通信不事先建立虚拟链路,NAT后面的LAN通信方需先发送消息给WAN通信方以洞穿NAT,然后才可以进行双向通信,这即是常提到的“UDP打洞(Hole Punching)”问题。

TCP连接百度过程解析

下文对百度的完整抓包建立在不使用缓存的基础上。如若主机存有百度站点的cookie和脱机缓存(Offline Cache),则不会再请求地址栏图标favicon.ico;请求/js/bdsug.js?v=1.0.3.0可能回应“HTTP/1.1 304 Not Modified”。可在浏览器打开百度首页后,Ctrl+F5强制刷新,不使用缓存,也可参考《浏览器清除缓存方法》。

以下为访问百度过程,wireshark抓包数据。对于直接通过Ethernet联网的机器,Wireshark Capture Filter为"host www.baidu.com";对于通过PPP over Ethernet(PPPoE)联网的机器,Wireshark Capture Filter为"pppoes and hostwww.baidu.com"。以下抓包示例直接通过Ethernet联网访问百度的过程。可点击图片超链接下载pcap文件,使用wireshark软件查看。

为方便起见,以下将客户端(浏览器)简称为C,将服务器(百度)简称为S。

 

1.TCP三次握手建立连接

“http://”标识WWW访问协议为HTTP,根据规则,只有底层协议建立连接之后才能进行更高层协议的连接。在浏览器地址栏输入地址后按下回车键的瞬间,C建立与S(机器名为www.baidu.com,DNS解析出来的IP为220.181.6.175)的TCP 80连接(HTTP默认使用TCP 80端口)。

以下为三次握手建立TCP连接的数据包(Packet1-Packet3)。

1  192.168.89.125:5672→ 220.181.6.175:80   TCP(协议) 62(以太网帧长)

amqp > http [SYN] Seq=0 Win=65535 Len=0 MSS=1460SACK_PERM=1

2  220.181.6.175:8

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP发送数据流程详解 的相关文章

  • 如何模拟 TCP/IP 错误?

    在多层应用程序上 我需要模拟各种 TCP IP 错误来测试一些重新连接代码 有谁知道我可以使用什么工具 基于 Windows 来实现此目的 谢谢 Scapy http secdev org projects scapy 允许您控制数据包的各
  • 如何在java应用程序中检测FIN - tcp标志?

    我在两台计算机之间有持久的 TCP 连接 第二台计算机不受我的控制 第二台计算机可以随时发送FIN标志 并且首先必须关闭当前连接 将FIN标志发送回第二台计算机 我如何知道第二台计算机正在发送 FIN 标志 以及何时必须调用 Java 应用
  • 在 Golang Server 中接受持久的 tcp 连接

    我正在尝试使用 Go 并且想创建一个 TCP 服务器 我可以通过 telnet 访问该服务器 发送命令并接收响应 const CONN HOST localhost CONN PORT 3333 CONN TYPE tcp func mai
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如
  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • ADO.NET SQLServer:如何防止关闭的连接持有S-DB锁?

    i Dispose http msdn microsoft com en us library system data sqlclient sqlconnection close aspx一个 SqlConnection 对象 但是当然它并
  • 如何抑制Windows防火墙的Windows安全警报?

    当我从这里找到的 ZeroMQ 指南中用 C 创建 Hello World 示例时 http zguide zeromq org page all Ask and Ye Shall Receive http zguide zeromq or
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • 使用 InputStream 通过 TCP 套接字接收多个图像

    每次我从相机捕获图像时 我试图将多个图像自动从我的 Android 手机一张一张地发送到服务器 PC 问题是read 函数仅在第一次时阻塞 因此 从技术上讲 只有一张图像被接收并完美显示 但在那之后当is read 回报 1 该功能不阻塞
  • C#:如何在 Socket.BeginReceive 回调之前终止套接字?

    我有一个接收来自客户端的连接请求的服务器 该服务器使用异步Socket BeginReceive and Socket EndReceive方法 该代码与找到的代码非常相似here http msdn microsoft com en us
  • iPhone 上的 TCP 打洞

    我已经阅读了一些内容 虽然我是 iPhone 网络的新手 但我想知道 TCP 打孔是否可以通过 NAT 连接两台 iPhone 我还阅读了一些有关 uPnP 和发夹的有用内容 但我根本不熟悉这些内容 所以如果有人对这是否可能有任何想法 我的
  • 服务器套接字在 Close_Wait 中挂起

    场景如下 我正在从 C 服务器应用程序向客户端发送大量数据 突然数据流停止 客户端没有数据更新并且端口被阻塞 发生这种情况时 服务器端症状是 Close Wait 在该端口 netstat 操作将在日志中阻塞 错误代码 135 无法从客户端
  • 具有非阻塞或多线程功能的 Ruby Tcp Server 类

    找不到任何可以帮助创建非阻塞 多线程服务器的 gem 或类 哪里可以找到 The Ruby 文档 http ruby doc org core classes Socket html M002091关于套接字有一些很好的例子 使用该页面中的
  • TCL类C10K事件服务器开发进展如何?

    TCL 是一种很好的简单编程语言 但似乎没有得到认可和 或尊重它deserves http antirez com articoli tclmisunderstood html 我 1995 年在大学时就学过它 但很快就忘记了 直到最近才再
  • PHP 通过 TCP/IP 发送消息

    我尝试通过 TCP IP 从 PHP 网站向 Arduino 发送消息 使用以下代码我可以从 php 网站发送消息 问题是 当第一次调用该网站时 消息不会立即发送 网站刷新几次后 消息就会到达 但逻辑上很多次 就像网站刷新量一样 已经尝试将
  • SO_REUSEPORT 可以在 Unix 域套接字上使用吗?

    Linux 内核 gt 3 9 允许通过设置在内核负载平衡的进程之间共享套接字SO REUSEPORT http lwn net Articles 542629 http lwn net Articles 542629 这如何用于类型的套接
  • 使用 TcpClient 通过 C# 通过 TCP 发送多个文件

    我正在尝试使用 C TcpClient 通过 TCP 发送多个文件 对于单个文件来说它效果很好 但是当我有多个文件时 它只发送第一个文件 这是我的代码 发送文件 try TcpClient tcpClient new TcpClient N

随机推荐

  • vue页面跳转没有ajax,vue axios 在页面切换时中断请求方法 ajax

    搜索热词 如下所示 强行中断请求要用到的 cancel c then res gt res data res gt 中断请求和请求出错都会走这里 我这里用 cancelAjaxText 来区别 if res message cancelAj
  • 斜度符号标注_机械制图之一基础知识学习(几何作图和斜度、锥度)

    今天我们讲机械制图之一基础知识学习 几何作图和斜度 锥度 七 八 九 几何作图 几何作图主要是告诉我们如何作图 主要讲的是方法 会了这些方法以后就好画图了 首先我们说说 1 等分已知线段 已知条件 线段AB 做三等分 作图步骤 过A点做任意
  • jenkins教程菜鸟_菜鸟 jenkins自动化测试构建实战

    之前写了一个karate框架的接口自动化项目 一直想通过jenkins定时跑起来 这样就方便实时监控接口运行动态了 于是乎我决定在本地下载docker搭建个jenkins容器来构建该项目 对于docker和jenkins我完全是小白一枚 用
  • windows python kafka 初级使用

    今天花了点时间在这个kafka上 因为我们工作中也用到了kafka 我这边对于kafka的理解是能用或者知道基本原理就行 实现在自己的windows环境搭建一次kafka 然后使用python进行数据的生产和消费 如果之后工作中对于kafk
  • WGS84坐标与Web墨卡托坐标互转

    在WebGIS的开发中经常用到的地图投影为Web墨卡托和WGS84 故歌地图 bingmaps 百度地图 mapabc mapbar 以及ArcGIS online上的大部分地图为Web墨卡托地图 ArcGIS online上最开始发布的地
  • vue eslint 报错:Component name “xxxxx“ should always be multi-word.eslintvue/multi-word-component-name

    报错代码 vue cli 全新创建项目 并建立组件时提示报错 VSCode 会标红提示 如图 npm run serve yarn serve也会报错 Ctrl Shift M 问题面板出现 原因 新手在组件命名的时候不够规范 根据官方风格
  • 憨批的语义分割6——制作语义分割数据标签

    憨批的语义分割6 制作语义分割数据集 学习前言 制作工具Labelme Labelme的使用 标签文件内容 学习前言 有些小伙伴问怎么制作数据集 其实我也没有去制作过 所以也要学学啦 制作工具Labelme 这里要用到Labelme工具 在
  • 2023华为笔试机考题库 Java【无向图染色】

    题目 你有一个无向图 需要给它上色 只有两种颜色供你选择 红色和黑色 但有一个条件 两个相邻的节点 即直接相连的节点 不能同时被染成红色 现在的问题是 有多少种不同的上色方案满足这个条件 输入 第一行包含两个整数M和N 其中M表示图中的节点
  • java和android程序员使用web3j进行区块链以太坊开发详解

    如何使用web3j为Java应用或Android App增加以太坊区块链支持 教程内容即涉及以太坊中的核心概念 例如账户管理包括账户的创建 钱包创建 交易转账 交易与状态 智能合约开发与交互 过滤器和事件等 同时也详细说明如何使用web3j
  • 密码提取神器 mimikatz 现已支持Windows 10 RS2

    本文讲的是 密码提取神器 mimikatz 现已支持Windows 10 RS2 昨天稍早 安全研究者 gentilkiwi 在推特上宣布 知名密码提取工具mimikatz推出v2 1 1新版 正式支持Windows 10 RS2 1707
  • 卷首语:我决定从零开始,用C++手写自己的键值数据库

    2023年5月1日 周一下午 我为什么要自己写一个 今天中午 我在CSDN上提出了一个关于如何学习C 的观点 通过用C 造东西来学习C 于是为了实践这个观点 我决定用C 手写一个简单的属于自己的键值数据库 我会把这个键值库写到什么程度 只要
  • 双色球笔记2--保存所有双色球号码到MySQL

    双色球笔记2 保存所有双色球号码到MySQL 1 功能 本代码主要将双色球所有数据保存到mysql数据库 双色球总种类为17721088 笔者8G I7笔记本大约插入了10天 下面代码中包含两中方法 Insert SSQ 和Insert S
  • springcloud集成apollo

    apollo 配置中心 官网 Apollo 官网有设计 部署说明 系统架构图 github开源官网https github com apolloconfig apollo releases releases上下载后发现有这4个文件 apol
  • Docker学习笔记(二):Docker镜像原理、Docker数据卷(挂载)作用和使用

    Docker镜像详解 1 镜像是什么 镜像是一种轻量级 可执行的独立软件包 用来打包软件运行环境和基于运行环境开发的软件 它包含运行某个软件所需的所有内容 包括代码 运行时 库 环境变量和配置文件 所有应用打包成docker镜像 就可以直接
  • 少儿创意学编程(Scratch基础篇):第4课——聊天机器人

    少儿创意学编程 Scratch基础篇 参考了英国公益组织发起的 code club 代码俱乐部 少儿免费学编程活动 愿为中国的少儿创意编程教育尽微薄之力 对国内的家长 信息教师和相关教育机构有所帮助 共同促进软件素质教育的发展 本课程以Sc
  • Qt4.8.2 QPushButton按钮贴图以及实现按钮的几种常用状态

    一 继承自QPushButton 不改变图片本身 而是通过改变按钮背景的透明度 myPushButton h cpp view plain copy ifndef MYPUSHBUTTON H define MYPUSHBUTTON H i
  • 支持向量机类实现

    import os import jieba import numpy as np from sklearn model selection import train test split cross val score from skle
  • 5分钟带你了解写博客的重要性——博客的大门为你敞开

    文章目录 前言 为什么要写博客 写博客有什么用 1 检验自己对知识是否真的理解 2 积累知识并让自己变成合规的 卷王 3 讨论反思 收获新认知 4 提升思维逻辑力和文字组织力
  • Docker运行MySQL容器

    目录 一 宿主机与容器之间的文件拷贝 1 利用MySQL镜像安装MySQL服务 2 容器中怎么上传项目 文件 3 从容器中拷贝文件到宿主机 4 从宿主机拷贝文件到容器 二 数据卷 三 数据卷容器 四 Dockerfile 本次目标 数据卷
  • TCP发送数据流程详解

    B S通信简述 整个计算机网络的实现体现为协议的实现 TCP IP协议是Internet的核心协议 HTTP协议是比TCP更高层次的应用层协议 HTTP HyperText Transfer Protocol 超文本传输协议 是互联网上应用