前言:在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. JAVA把毫秒数转换成日期

    JAVA把毫秒数转换成日期 systemMillonSenconds = System.currentTimeMillis();   2012-08-17 14:42 1456人阅读 评论(1) 收藏 ...

  2. [BZOJ 4010][HNOI 2015] 菜肴制作

    4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 1776  Solved: 889[Submit][Status ...

  3. 微软报表A4纸大小规则

    总页宽:21cm,总页高:29.7cm 上下左右边距均为2.5cm 页眉页脚均为0.75cm 正文内容宽:16cm,高23.2cm

  4. metasploit 渗透测试笔记(meterpreter篇)

    0x01 背景 meterpreter作为后渗透模块有多种类型,并且命令由核心命令和扩展库命令组成,极大的丰富了攻击方式. 需要说明的是meterpreter在漏洞利用成功后会发送第二阶段的代码和me ...

  5. 015.1 Lock接口

    内容:Lock接口使用步骤,同步生产大白兔奶糖的例子 同步代码块的锁是隐式的,显式容易让我们理解.所以我们使用这个显式的方法,方便理解代码.######实现同步步骤:1.获取锁:lock()2.同步代 ...

  6. Mac原生Terminal快速登录ssh

    1. 创建rsa key 在终端中输入以下命令: ssh-keygen -t rsa 完成之后可以在~/.ssh目录下找到公钥和私钥     如果你与我一样有使用gitlab,那么这个秘钥应该已经存在 ...

  7. html5和CSS3中新特性

    H5 1.语义化标签 header.footer.aside.nav.section.article 2.表单输入类型 email.url.number.range.Date Pickers.sear ...

  8. Java中String直接复制和new String创建对象的区别以及equals和==的区别和效率对比

    编程语言中的问题很多时候我们看似懂,实际不懂,因为很多时候看不到更多的情况,从而缺少对这些看不到的情况的认知和解释. 今天mark一下String和new String()的区别.其实很简单. Str ...

  9. 【[JXOI2017]加法】

    江西竟然还有省选,而且还是可怜题,实在是有点可怕 这道题还是比较清真的,大概是最简单的可怜题? 首先看到最大值最小,就很容易想到了二分答案 对于一个二分出来的答案\(mid\),去把原数列扫一遍就可以 ...

  10. MVC渲染文章内容的html标签转义

    文章详情页一般从数据库中取出文章内容,文章内容一般含有 等html标签,MVC中如果直接从模型输出文章内容,会把html标签转义变成<&gt等,这时候是要把转义后的标签变成html标签, ...