`
吃货吃货
  • 浏览: 33010 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

TCP深入解析(一)

阅读更多

前段时间通过学习计算机网络自己也算是有了一些心得,特意参照SMTP协议以及POP3协议自己写了一个类似于接收邮件的应用层协议,以后再详细简介,也是基于SOCKET TCP通信实现。

那么我们先来段关于TCP协议的简介:

首先,还是老样子,来自百度百科的定义:

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

相信这个简介已经是足够详细,我在此就不在进行更多的复述,那么通过上面,我们可以很明显的注意到,TCP协议与它的兄弟协议-UDP最明显的区别就是,TCP协议是一个面向连接的、可靠的传输协议,也就是说在任何的网络情况下,使用TCP协议传输数据是一定可以保证报文段的按序到达。

那么相对应而言,可靠数据传输的原理是什么呢?

首先我们知道底层一般使用的都是不可靠传输协议,如IP协议,提供的就是尽力而为服务。再参考一下我们日常对话的时候,每当有一方说一大段话时,另一方总会回复“我知道了”或者“我没听清,再说一遍”之类的。那么我们也可以考虑在对应的传输层协议中加上肯定确认(OK)和否定确认(请重复),更详细的来说就是,当我们检测到收到的报文段没有错误时,接收方就向发送方反馈一条肯定确认,否则,接收方就向发送方反馈一条重复确认,这时,发送方就会执行重传操作。虽然看起来这样子已经实现了一个可靠传输协议,不过还是有一个小问题,即如果当返回的确认字段出错了。我们现在通常采用的方法是(包括TCP)当发送方收到错误的肯定确认或者重复确认,只需重传当前分组即可,但是现在却存在一个新的问题,即可能出现冗余分组。那么解决这个问题的一个简单方法是为报文段加一个新的字段,让发送发对数据分组编号,即将发送数据分组的序号放在该字段,这样,发送方只需要检查序号即可确定到达的分组是否一次重传。那么现在在数据传输途中数据可能会出错的问题就已经被解决掉啦~可是,我们都知道在网络情况不好的情况下,底层信道很有可能出现丢包的情况。那么在这种情况下,我们就需要引进一个倒计数计时器,发送就可以做到,每次发送一个分组(包括重传),便启动一个定时器,在收到响应的ACK(肯定确认)时,可中断定时器,但在定时器结束之前尚未收到ACK时,就重传该分组。这样子,一个基本的可靠传输协议就实现了,但是它的性能却非常糟糕,因为每当传输一个分组时,整个发送方需要停止下来等待ACK回复,如果当网络出现时延时,这种情况无疑会变得更加糟糕,因此,我们可以为该协议添加一个流水线技术:

1.增加发送方一次发送的序号范围;

2.发送发和接收方可以缓存多个分组;

3.当出现差错时,如分组丢失,损坏或者延时过大,可以解决流水线的差错恢复问题,目前解决该问题主要有两种方法:回退N步和选择重传。

TCP报文结构



 

各个字段说明:

1.源端口和目的端口:各占 2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现

2.序号:占 4 字节.TCP 连接中传送的数据流中的每一个字节都编上一个序号.序号字段的值则指的是本报文段所发送的数据的第一个字节的序号

3.确认号:占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号

4.数据偏移/首部长度:占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远.“数据偏移”的单位是 32 位字(以 4 字节为计算单位)

5.保留:占 6 位,保留为今后使用,但目前应置为0

6.紧急URG:当 URG=1 时,表明紧急指针字段有效.它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)

7.确认ACK:只有当 ACK=1 时确认号字段才有效.当 ACK=0 时,确认号无效

PSH(PuSH):接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付

8.RST (ReSeT):当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接

9.同步 SYN:同步 SYN = 1 表示这是一个连接请求或连接接受报文

10.终止 FIN:用来释放一个连接.FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接

11.检验和:占 2 字节.检验和字段检验的范围包括首部和数据这两部分.在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部

12.紧急指针:占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)

13.选项:长度可变.TCP 最初只规定了一种选项,即最大报文段长度 MSS.MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节.” [MSS(Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度.数据字段加上 TCP 首部才等于整个的 TCP 报文段]

填充:这是为了使整个首部长度是 4 字节的整数倍

其他选项:

窗口扩大:占 3 字节,其中有一个字节表示移位值 S.新的窗口值等于TCP 首部中的窗口位数增大到(16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小

时间戳:占10 字节,其中最主要的字段时间戳值字段(4字节)和时间戳回送回答字段(4字节)

选择确认:接收方收到了和前面的字节流不连续的两2字节.如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据

现在就先说这么多吧,下次我再总结一下当前的两种主要重传策略(回退N步和选择重传)的实现方式。

 

  • 大小: 68.6 KB
7
2
分享到:
评论

相关推荐

    深入解析Windows操作系统.第六版

    《深入解析Windows操作系统》第六版是一本权威且深入的技术书籍,专注于揭示Windows 7和Windows Server 2008 R2操作系统的内核层面的工作原理。本书由David A. Solomon和Mark Russinovich两位专家撰写,他们对于...

    基于TCP的简单一对一聊天程序设计

    本教程将深入讲解如何设计一个基于TCP的一对一聊天程序,这将涵盖网络编程的基础知识、TCP协议特性和聊天程序的具体实现。 首先,TCP协议是互联网协议栈中的传输层协议,它的特点是提供端到端的、可靠的数据传输。...

    Ethernet-Tcp-Udp.rar_TCP 解析_TCP解析_c# tcp/udp_udp解析_解析UDP

    TCP和UDP的解析涉及到网络编程的基本概念,包括端口号、套接字编程、网络字节序转换以及错误处理。在C#中,开发者需要理解Socket类的使用,包括bind、listen、accept、connect、send和recv等方法,以及异步编程模型...

    Vpp tcp层代码解析.pdf

    ### VPP TCP层代码解析 ...文档中详细解析了服务端如何通过一系列函数调用来实现TCP连接监听,并通过状态机图来展示TCP的处理逻辑。理解这些流程对于深入掌握VPP以及网络协议栈内部工作机制至关重要。

    深入解析TCP、HTTP、Socket、Socket连接池.rar

    本资源“深入解析TCP、HTTP、Socket、Socket连接池.rar”旨在帮助开发者深入理解这些核心概念,并探讨Socket连接池的使用。 TCP是一种面向连接的、可靠的传输层协议,它保证了数据的顺序传输和无损传输。TCP通过三...

    用Java实现对IP/TCP协议数据包的拦截和分析

    2. **数据包捕获与解析**: 在Java程序中,我们需要创建一个数据包监听器,当有新的IP/TCP数据包到达时,该监听器会被调用。在这个监听器内部,我们可以使用提供的API来解析数据包,获取源IP、目的IP、TCP标志字段...

    tcp转发工具,中转TCP请求

    4. **源码解析**:Java源码提供了实现TCP转发的具体逻辑。通常,这包括使用Java的`ServerSocket`类创建服务器端监听,使用`Socket`类建立客户端和服务器之间的连接,以及使用输入/输出流进行数据读写。理解源码可以...

    linux TCP IP协议栈源码解析资料大全

    本资料大全深入解析了Linux下TCP/IP协议栈的源码,为理解其工作原理提供了宝贵的资源。 首先,我们关注《TCPip在linux下的具体实现.doc》文档,它可能详细介绍了Linux系统如何实现TCP/IP协议的具体步骤和机制。这...

    课程设计-TCP数据包解析,网络嗅探器

    综上所述,这个“课程设计-TCP数据包解析,网络嗅探器”项目旨在通过C#语言实现一个功能完善的网络嗅探工具,不仅可以解析TCP和UDP数据包,还提供了一种直观的方式来理解底层网络通信的细节。通过学习和实践这个项目...

    TCP三次握手机制:深入解析与Java实现

    通过这个过程,两个通信节点能够确认彼此的发送和接收能力,从而建立起一个稳定的连接。理解三次握手的原理对于网络编程和故障排查至关重要。在实际应用中,开发者需要根据具体的网络环境和应用需求,合理设计和优化...

    HCIA认证:深入解析OSI七层模型与TCP/IP协议簇的应用及功能

    HCIA认证:深入解析OSI七层模型与TCP/IP协议簇的应用及功能

    tcptrace TCP端口监听工具

    tcptrace是一款强大的TCP端口监听工具,它能够帮助开发者和网络管理员深入理解TCP连接的状态,对WCF(Windows Communication Foundation)和SOAP(简单对象访问协议)等基于TCP的服务进行调试。本文将详细介绍tcp...

    TCP调试助手源码_tcp助手源码_TCP助手源代码_TCP助手源码_

    TCP调试助手源码是一款专为IT专业人士设计的工具,它帮助开发者深入了解TCP协议的工作机制,同时也为TCP编程提供了一个实践平台。源代码的开放性使得用户可以深入学习TCP协议的实现细节,理解网络通信的基本原理,并...

    Netty一个端口支持tcp和websocket

    - 对于 TCP 连接,我们需要创建一个 `ByteToMessageDecoder` 来解析 TCP 数据包,例如可以使用 Netty 的 `Delimiters` 类来分割输入流中的数据。 - 对于 WebSocket 连接,我们需要实现 `...

    深入解析IPV6 高清版 绝对可以看(3-1)

    深入解析IPV6 高清版 绝对可以看 深入解析IPV6 高清版 绝对可以看

    MFC-TCP.rar_TCP通信_TCP通信MFC_mfc tcp 多线程_mfc tcp通信_mfc 多线程

    在IT领域,网络通信是应用程序之间交互的重要方式,而TCP(传输控制协议)作为网络通信的基础,被广泛应用于各种系统和应用中。...对于想要深入理解和实践MFC和TCP通信的开发者来说,这是一个非常有价值的参考资料。

    ROS环境下TCP/IP客户端和服务器端C++程序

    本文将深入探讨如何使用C++在ROS环境下编写TCP/IP客户端和服务器端程序,确保其“绝对可用”。 首先,理解TCP/IP协议基础至关重要。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,而...

    android TCP server 和TCP client通信源码

    这些信息对于正确地构建TCP通信至关重要,因为你需要知道如何构造正确的数据包来发送到模块,以及如何解析接收到的回应。 至于"ST-MW-08S"文件,这可能是模块的驱动程序、固件更新或者是一些配置文件。这些内容可以...

    tcp/ip 源码分析

    本文将深入探讨《TCP/IP源码分析》一书中的关键章节内容,旨在为读者提供一份详尽的指南。 #### 二、从一个练习开始(第4页) 这一章节通过一个小练习来引入TCP/IP的基本概念。通过这个练习,读者可以了解TCP/IP...

    ModbusTcpServer.zip_modbus_modbus_tcp_modbus服务_modbus服务器_tcp ser

    Modbus是一种广泛应用于工业自动化领域的通信协议,它允许设备之间进行简单、有效的数据交换。...通过理解和利用这些组件,你可以深入理解Modbus TCP的工作机制,并且能够高效地开发出符合需求的工业自动化解决方案。

Global site tag (gtag.js) - Google Analytics