前言:在FPGA上实现TCP协议实际是一个不太好的计划,因为FPGA最擅长的是流水线处理方式,而TCP存在交互,导致FPGA需要进行反馈式的处理。但是由于项目新增的附加要求而又只能在FPGA上去实现TCP协议,才有了这篇总结。

关于在FPGA上实现TCP的具体过程在另外一篇随笔上进行详细介绍。

TCP报文格式

源端口号(16bit)

目的端口号(16bit)

序列号(32bit)

确认序列号(32bit)

首部长度

(4bit)

保留(6bit)

URG

ACK

PSH

RST

SYN

FIN

窗口(16bit)

校验和(16bit)

紧急指针(16bit)

选项和填充

数据

ARP报文格式:

以太网目的地址(48bit)

以太网源地址(48bit)

帧类型

(16bit)

硬件类型(16bit)

协议类型(16bit)

硬件地址长度(8bit)

协议地址长度(8bit)

操作码(16bit)

发送者硬件地址(48bit)

发送者IP地址(32bit)

目标硬件地址(48bit)

目标IP地址(32bit)

TCP数据传输流程

搭建的测试环境很简单,就是用一根网线将两台笔记本连接起来,其中一台电脑上模拟客户端,另一台电脑模拟服务端,用wireshark进行报文抓取。

测试地址如下:

交互端

MAC地址

IP地址

TCP端口号

服务器(Server

a0:88:69:8f:2f:64

192.168.1.124

6920 (0x1b08)

客户(Client

a0:88:b4:77:46:44

192.168.1.115

3005 (0x0bbd)

1. 地址解析(ARP

(1)客户端向服务器发送一个寻址ARP包。

客户端发送ARP报文,寻找ip地址为192.168.1.115的主机的mac地址是多少。

(2)服务器收到ARP包后,向客户端发送一个带地址的ARP包。

服务端告诉客户端,我的mac地址是a0:88:69:8f:2f:64。

ARP结束(在TCP数据传输的后续过程中还会进行多次这样的ARP过程)。

2.TCP交互过程:

序列号

确认序列号

SeqNum

AckNum

2.1 建链(三次握手)

使用socket调试工具进行tcp调试。

     

STEP1客户端向服务器发送一个数据包(SYN),请求建立连接。Flags=0x02

初始SeqNum(ISN)由客户端随机产生,AckNum为0。

[SYN]包:SeqNum=0x753bb0dd     AckNum=0x00000000

STEP2服务器收到SYN请求数据包后,对客户端进行确认。Flags=0x12

初始SeqNum(ISN)由服务器随机产生,AckNum=客户端SeqNum + 1。

[SYN,ACK]包:SeqNum=0x98d82910     AckNum=0x753bb0de

STEP3客户端收到确认包后,再对服务器进行确认。Flags=0x10

SeqNum=收到上一帧的AckNum,AckNum=收到上一帧的SeqNum + 1。

[ACK]包:SeqNum=0x753bb0de     AckNum=0x98d82911

2.2 数据传输(数据包+ACK包)

     

STEP1发送数据:客户端向服务器发送一个带有数据的数据包。Flags=0x18

SeqNum=收到上一帧的AckNum,AckNum=收到上一帧的SeqNum。

STEP2确认收到:服务器收到该数据包,向客户端发送一个确认包。Flags=0x10

SeqNum=收到上一帧的AckNum,AckNum=收到上一帧的SeqNum + payload字节长度。

(1)发送长度为10字节的数据

[PUSH,ACK]包:SeqNum=0x753bb0de  AckNum=0x98d82911

[ACK]包:SeqNum=0x98d82911     AckNum=0x753bb0e8

(2)发送长度为14字节的数据

[PUSH,ACK]包:SeqNum=0x753bb0e8  AckNum=0x98d82911

[ACK]包:SeqNum=0x98d82911     AckNum=0x753bb0f6

2.3 断链(四次挥手)

    

STEP1客户端完成数据传输后,主动向服务器发送一个终止包(FIN)。Flags=0x11

SeqNum=收到上一帧的AckNum,AckNum=收到上一帧的SeqNum。

[FIN,ACK]包:SeqNum=0x753bb101      AckNum=0x98d82911

STEP2服务器收到终止数据包后,向客户端发送确认包进行确认。Flags=0x10

SeqNum=收到上一帧的AckNum,AckNum=收到上一帧的SeqNum + 1。

[ACK]包:SeqNum=0x98d82911     AckNum=0x753bb102

STEP3服务器完成数据传输后,向客户端发送一个终止包(FIN)。Flags=0x11

SeqNum=收到上一帧的AckNum,AckNum=收到上一帧的SeqNum。

[FIN,ACK]包:SeqNum=0x98d82911      AckNum=0x753bb102

STEP4客户端收到终止数据包后,向服务器发送确认包进行确认。Flags=0x10

SeqNum=收到上一帧的AckNum,AckNum=收到上一帧的SeqNum + 1。

[ACK]包:SeqNum=0x753bb102     AckNum=0x98d82912

3.TCP重传机制

TCP重传目的是防止报文的丢失。在使用TCP进行数据传输时,启动重传计时器(retransmission timer),在收到ACK确认报文后,停止重传计时器。TCP重传过程中有两个重要的参数,往返时间(RTT)和重传超时(RTO)。RTT是指发送端口从报文发出直至收到ACK确认报文所花费的时间。通过对RTT的值多次测量求平均来确定RTO的值。在默认配置下,Windows系统最大的重传次数为5次,Linux系统最大的重传次数为15次。


4. 分片、分段

 4.1. 最大传输单元(MTU

分片是针对IP协议存在的,IP报文的分片与重组是在网络层完成的。在以太网中,MTU=1500字节,对长度大于MTU的报文进行分片处理,分片后的IP报文不一定按序到达对端。

4.2. 最大分段大小(MSS

分段是针对TCP协议存在的,TCP报文的分段与重组是在传输层完成的。MSS是指TCP报文每一次可以传输的最大数据段,TCP协议在三次握手建立连接的前两次握手中会协商双方的MSS值,MSS值的配置在TCP协议的选项字段中,TCP连接的双方会在握手中通过MSS值通知对方自己能够接收数据段的最大长度。

在一般情况下,MSS=MTU-IP首部长度-TCP首部长度=1500-20-20=1460字节。如果在三次握手的过程中不对MSS值进行配置,默认的MSS为536字节。

TCP的options字段:

5. 滑动窗口技术

由于FPGA资源有限,在FPGA中一般无法实滑动窗口机制。

在发送端将数据分为四类:在窗口之外的已经成功发送并且被确认的数据、在窗口内的已经发送但未被确认的数据、在窗口内的接收端允许发送但未发送的数据、在窗口之外的接收端不允许发送的数据。

在接收端将数据分为三类:已经接收并回复确认但未被上层应用接收的数据、已经接收但未回复确认的数据、等待接收的数据。

注:在使用TCP协议进行数据传输中,并不是对于每一个报文段都回复ACK包,而是有可能对两个甚至多个报文段只回复一个ACK包。

TCP交互流程的更多相关文章

  1. 深入浅出 Redis client/server交互流程

    综述 最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文章都断断续续的非系统性的,不能给读者此交互流程的整体把握.所以这里我 ...

  2. coTurn 运行在Windows平台的方法及服务与客户端运行交互流程和原理

    coTurn是一个开源的STUN和TURN及ICE服务项目,只是不支持Windows.为了在window平台上使用coTurn源码,需要在windows平台下安装Cygwin环境,并编译coTurn源 ...

  3. RTMP协议推流交互流程

    目录 RTMP协议推流交互流程 RTMP协议推流流程 RTMP握手 RTMP建立连接 RTMP建流&Play Wireshark抓个RTMP流 RTMP协议推流交互流程 想了解下直播常见协议R ...

  4. 关于AJAX 的交互模型、交互流程及代码示范

    AJAX  = 异步JavaScript + XML. 它是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况 ...

  5. 软件测试面试必问--bug交互流程

    目前市场主要用的bug管理工具:禅道.jira.QC.bugfree等,当然也有自己公司开发的. 不过不管哪一种工具,核心交互流程都是差不多的,只是字段的名称不一样而已,参考如下两张示意图: 这是前几 ...

  6. javaweb 与jsp页面的交互流程 (初次接触时写)

    javaweb 与jsp页面的交互流程 javaweb项目目录 1. javaweb项目的一般目录: 2. jsp 页面一般情况下放在 top(前台页面) back(后台页面) 3. 后台代码 放在s ...

  7. bing背单词交互流程 - Chongyang Bai

    昨天和travis,钟秋开会确认了bing背单词的手机界面交互流程.我在这里简单描述一下,设计页面暂时不能贴出来,期待大家的宝贵意见 b( ̄▽ ̄)d. 单词本浏览界面:单词本被分为两类,用户单词本和单 ...

  8. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-3.微信Oauth2.0交互流程讲解

    笔记 3.微信Oauth2.0交互流程讲解     简介:讲解微信Oauth2.0交互流程              参考:https://open.weixin.qq.com/cgi-bin/sho ...

  9. JAVAEE 和项目开发(第二课:HTTP协议的特点和交互流程)

    HTTP 的概念和介绍 概念:超文本传输协议(Hyper Text Transfer Protocol) 作用:规范了浏览器和服务器的数据交互 特点: 简单快速:客户向服务器请求服务时,只需传送请求方 ...

随机推荐

  1. Exchange2016 & Skype for business 集成之一配置合作伙伴应用程序

    准备条件 为Skype for Business Server和Exchange Server之间建立服务器到服务器的身份验证,您必须做两件事:1)您必须为每台服务器分配合适的证书(详细参考文档htt ...

  2. webapi 支持 text/plain 请求

    今天遇到一个需求,请求以HTTPS + XML 访问我的API ,普通的webapi 是不支持这个请求的,故做以下代码进行支持 新增一个类,类名为PlainTextTypeFormatter publ ...

  3. July 31st 2017 Week 31st Monday

    Elegance is the only beauty that never fades. 优雅是唯一不会褪色的美. Even the most beautiful apperace would be ...

  4. Python运算符和数据类型

    一.Python的逻辑运算符 1.数字运算符: 运算符 描述 例子 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * ...

  5. AngularJs学习笔记--Using $location

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/dev_guide.services.$location 一.What does it do? $loc ...

  6. BZOJ 1059 矩阵游戏 二分图匹配

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1059 题目大意: 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏 ...

  7. 没有什么问题是sudo rm -rf /* 解决不了的

    没有什么问题是sudo rm -rf /* 解决不了的. . . . . . . 如果有的话,赶紧跑.

  8. UVA529 Addition Chains

    嘟嘟嘟 还是\(IDA*\). 这道题是\(ZOJ\)的加强版,\(n\)从\(100\)扩大到了\(10000\),所以必须有非常给力的剪枝才能过. 除了迭代加深,还要加上估价函数:对于当前数\(x ...

  9. programming-languages学习笔记--第6部分

    programming-languages学习笔记–第6部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} program ...

  10. 3、RabbitMQ-work queues 工作队列

    work queues 工作队列 1.模型图: 为什么会出现 work queues? 前提:使用 simple 队列的时候 我们应用程序在是使用消息系统的时候,一般生产者 P 生产消息是毫不费力的( ...