`
吃货吃货
  • 浏览: 31982 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

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

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

    深入解析Windows操作系统中文.part2.rar

    深入解析WINDOWS操作系统(第4版) ISBN:9787121039690 本书是著名的操作系统内核专家Mark Russinovich和David Solomon撰写的Windows操作系统原理的最新版著作,全面和深入地阐述了Windows操作系统的整体结构以及...

    TCP/IP高效编程(Effective TCP/IP Programming)

    《tcp/ip高效编程:改善网络程序的44个技巧》是tcp/ip 领域的经典著作,对tcp/ip 网络编程中存在的各种问题进行了全面解析,旨在帮助读者深入透彻地理解tcp/ip 网络编程。本书组织方式比较特别,正文部分包括4 章,将...

    ACE技术内幕:深入解析ACE架构设计与实现原理

    《ace技术内幕:深入解析ace架构设计与实现原理》从构架模式、编程示例和源代码3个维度系统地对经典网络框架ace(adaptivemunicationenvironment)的架构设计和实现原理进行了深入分析,它能解决4个方面的问题:,...

    TCPIP详解--共三卷

    TCP/IP详解 卷1:协议 译者序 前言 第1章 概述 1 1.1 引言 1 1.2 分层 1 1.3 TCP/IP的分层 4 1.4 互联网的地址 5 1.5 域名系统 6 1.6 封装 6 1.7 分用 8 1.8 客户-服务器模型 8 1.9 端口号 9 1.10 标准化过程 10 ...

    Linux下TCP/IP服务器实现源码解析(含源码)

    对于菜鸟接触linux,网络是由浅入深的步步提高深化的源码解析笔记! 其中不乏老鸟也需要深入的技术! (内附赠送linux内核分析图和linux文件解析表) 希望大家互相交流 共同进步!! 拜交好友!

    TCP为什么需要进行三次握手深入解析

    本文将详细介绍TCP为什么需要进行三次握手,需要深入了解的朋友可以参考下

    TCP协议中,Socket编程的通信原理深度解析

    本文档分析了TCP协议中利用Socket编程所使用的一些重要函数,并深入分析了Socket通信所使用的一些技术。

    深入理解Nginx模块开发与架构解析第2版pfd版带书签

    读者对象 本书适合以下读者阅读。 ·对Nginx及如何将它搭建成一个高性能的Web服务器感兴趣的读者。...在阅读本书第三部分时,需要读者对TCP有一个基 本的了解,同时对Linux操作系统也应该有简单的了解。

    TCPIP高效编程:改善网络程序的44个技巧 PDF中文版带书签-目录

    《TCP/IP高效编程:改善网络程序的44个技巧》是TCP/IP 领域历久弥新的经典著作,网络编程人员必备,对TCP/IP 网络编程中存在的各种问题进行了全面解析,旨在帮助读者深入透彻地理解TCP/IP 网络编程。本书组织方式比较...

    TCP-IP详解

    是本通俗易懂的内核入门书籍。虽不是大牛写的,但对内核代码做了较深入的解析,值得一读

    深入理解Nginx模块开发与架构解析第2版PDF

    帮助读者了解一般Nginx模块的用法,然后重点介绍了女口何开发HTTP模块(含HTTP过滤模块)来得到定制化的Nginx,其中包括开发—个功能复杂的模块所需要了解的各种知识,并对内存池的实现细节及TCP协议进行了详细介绍;...

    深入理解Nginx模块开发与架构解析第2版LinuxUnix技术丛书-4.pdf

    帮助读者了解一般Nginx模块的用法,然后重点介绍了如何开发HTTP模块(含HTTP过滤模块)来得到定制化的Nginx,其中包括开发一个功能复杂的模块所需要了解的各种知识,并对内存池的实现细节及TCP协议进行了详细介绍;...

    深入理解Nginx模块开发与架构解析(第2版).zip

    帮助读者了解一般Nginx模块的用法,然后重点介绍了女口何开发HTTP模块(含HTTP过滤模块)来得到定制化的Nginx,其中包括开发—个功能复杂的模块所需要了解的各种知识,并对内存池的实现细节及TCP协议进行了详细介绍;...

    深入理解nginx模块开发与架构解析第二版

    帮助读者了解一般Nginx模块的用法,然后重点介绍了女口何开发HTTP模块(含HTTP过滤模块)来得到定制化的Nginx,其中包括开发—个功能复杂的模块所需要了解的各种知识,并对内存池的实现细节及TCP协议进行了详细介绍;...

    深入理解Android网络编程技术详解与最佳实践(带书签目录高清完整版).陈文.郭依正.pdf

    不仅系统讲解了Android网络编程的各项核心技术和功能模块,通过多个案例解读了Android网络编程的方法和技巧,而且从源码角度深入解析了Android核心网络处理方法和关键应用的实现原理,包含大量最佳实践。  全书共11...

    深入理解Nginx:模块开发与架构解析 陶辉

    ❑对Nginx及如何将它搭建成一个高性能的Web服务器感兴趣的读者。❑希望通过开发特定的HTTP模块实现高性能Web服务器的读者。❑希望了解Nginx的架构设计,学习怎样充分使用服务器上的硬件资源的读者。❑了解如何快速...

    深入理解Nginx:模块开发与架构解析.陶辉(带详细书签)

    当你基于Nginx开发高效的TCP服务器时,是否对如何让功能子模块仅关注于业务的开发、忽视底层事件的处理而着急?不用担心,本书将提供一条捷径,使你不用通过阅读一行行的Nginx源代码来找到模块开发方法,而是简单地...

    java面试手册(逆袭)

    手册内容包括对Java编程语言的深入解析,涵盖了语法、面向对象编程、多线程等核心概念。此外,对于与Java生态系统密切相关的框架,如Spring、Hibernate等,提供了详细的介绍和实际应用指南。 在计算机网络部分,...

Global site tag (gtag.js) - Google Analytics