上一博客记录了UDP协议的关键要点,这部分记录TCP协议的关键要点。

24.3 传输控制协议(TRANSMISSION CONTROL PROTOCOL)

  TCP(Transmission Control Procotol )协议是一个面向连接,可靠的协议。TCP为了提供面向连接的服务,专门定义了连接创建,数据传输、连接终止阶段。TCP使用GBN和SR协议来提供可靠性。为了实现可靠性这个目标,TCP使用检验和来进行误差控制、重传来处理数据包丢失和冲突、同时还利用了应答和计数机制。在本节,首先讨论TCP提供的服务,然后讨论TCP的详细特征。

24.3.1 TCP服务

进程到进程的通讯(Process-to-Process Communication)

  像UDP一样,TCP使用端口号提供基于进程到进程的通讯。

流分发服务(Stream Delivery Service)

  和UDP不同,TCP是面向流的,允许发送进程以字节流的方式发送,然后接收方以字节流的方式接受数据,TCP创建了虚拟的管道环境,从而使得发送进程和接收进程连接起来。图24.4表示了双方数据流的传输。

发送和接收缓冲区(Sending and Receving Buffers)

  因为接收方和发送方的读写数据的速度不一样,TCP需要缓冲区进行数据存储。存在两个缓冲区,发送缓冲区和接收缓冲区。缓冲区在TCP的流量控制和误差控制发挥作用,这点稍后将会介绍。一种  实现缓冲区的方式是使用循环的字节数组,如图24.5所示。

  

  图中展示了数据在缓冲区的流动方向,对于发送方,缓冲区可以分成三个部分。白色的部分表示还没装载数据的缓冲区部分,由发送进程来填充,橙色部分存储的是已经发送但还没被接收方应答的字节数据,TCP发送者会保留该区域的数据直到接收到了接收方的应答。黑色部分表示将要发送的数据。橙色部分的数据被应答之后,可以重新由发送进程来填充。

  接收方的接收缓冲区的操作会简单一些,环形的缓冲区分为两个部分。白色部分表示还没装载数据的缓冲区部分,橙色部分表示已经接收,可供接收进程进行数据读取的缓冲区部分。当一个字节被接收进程读取之后,整个缓冲区将会循环,同时更新白色缓冲区部分。

片段(Segment)

  尽管缓冲区可以处理发送方和接收方处理数据不一致的问题,但是在进行数据发送之前,还需要做一步。向TCP服务的网络层是以数据包的形式发送数据,而不是数据流。在传输层,TCP会封装一定字节的数据成一个数据包,叫片段。TCP将会在每个数据片段加一个头部,然后将数据提交给网络层进行数据传输。数据片段在网络层封装成IP数据报然后传输,对于接收进程,整个过程是透明的。等会还会介绍接收方接收到无序、存在丢失和冲突数据以及重新传输的情况,这些都是由TCP接收方接收进程来处理的。图24.6展示了数据片段是如何由发送缓冲区的字节生成的。需要注意的一点是,片段的长度不是恒定的。

 

全双工通讯(Full-Duplex Communication)

  TCP提供全双工通讯,也就是数据流能同时在两个方向进行传输,每个TCP终端都有一个发送缓冲区和一个接收缓冲区。

面向连接的服务(Connection-Oriented Service)

  和UDP不同,TCP是面向连接的的协议,当A端的一个进程想发送数据或者接收数据到B端另一个进程时,以下三个阶段将会出现:

  a.两个TCP创建一条逻辑上连通的传输通道

  b.数据在双方双向传输

  c.终止连接

可靠的服务(Reliable Service)

  TCP是一种可靠的传输协议,使用应答机制来检查数据的传输安全。

24.3.2 TCP特征(TCP Feature) 

计数系统(Numbering System)

  尽管TCP软件能够追踪片段的传输和发送,但它不是用片段数来记录数据的发送,而是用序列号和应答号两个字段来记录传输字节数。

字节数(Byte Number)

  TCP在数据传输过程中记录所有传输的字节数。计数在接收方和发送方是独立的,当TCP接收字节从一个进程时,TCP存储数据在缓冲区,并且记录字节数,计数并不是从0开始的,而是随机选择一个0到(2^23-1)之间的数据。例如,如果初始数据是1057,要发送的数据总长度为6000字节,字节的编号就是1057到7056。字节计数主要用来进行流量控制和误差控制。

序列号(Sequence Number)

  字节编号之后,TCP将会分配一个系列号到每一个将要发送的片段,序列号根据以下规则定义:

  1.第一个字段的序列号是初始序列号ISN(Initial sequence number),也就是一个随机生成的数。

  2.其他片段的序列号是上一个片段序列号加上上一个片段传输的字节数。

  当一个片段携带用户数据和控制信息时,它需要加上序列号,当一个片段没有携带数据时,不需要定义序列号,序列号字段还是存在的,只是是无效的。需要注意的是,有些片段,虽然只是携带了控制信息,却需要序列号来允许接收方来进行数据应答,这些字段用来进行连接创建,终止,中断。每个这类片段默认是一个数据长度,但是实际中是没有数据的。

应答号(Acknowledgment Number)

  在通讯过程总,通讯双方都用序列号记录了每个片段携带的第一个数据的编号。同时,接收方和发送方还会用应答号来应答接收的数据。应答号定义了对方下一个要发送的字节的序列号。

24.3.3 片段(Segment)

  TCP中一个数据包叫片段。

格式(Format)

  片段的格式如图24.7所示,片段包括一个20-60字节的头部,然后就是数据部分。如果没有其他选项,头部20字节长度,否则,头部是60字节长度。

  source port address:定义发送方的端口号。

  destination port address: 接收方的端口号。

  sequence number :序列号,初始序列号(ISN)随机产生。

  acknowledgment number:应答号,定义接收方下一个期望接收的字节数据起始编号,如果接收方已经成功字节编号为X的数据,应答号就是X+1。

  header length: 头部长度。

  control:该字段包括6个不同的控制位或者控制标志,如图24.8所示。这些位可以用来流量控制,连接创建,连接中断,连接断开。图24.8给出了这些位的含义。

  window size:该字段定义了发送数据的窗口大小,长度为16位,最大数据是65535字节。该值一般用于指接收方的接收窗口大小,发送方必须考虑接收方的接收窗大小。

  checknum:校验和,16位。

封装(Encapsulation)

  TCP片段封装从应用层提交过来的数据,然后在网络层,TCP片段被封装成IP数据报,进而在数据链路层被封装成帧。

24.3.4 TCP连接过程(A TCP Connection)

  TCP连接包括三个阶段:连接创建、数据传输、连接终止。

连接创建(Connection Establishment)

  三次握手(Three-Way Handshaking)

  TCP创建连接的过程叫做三次握手,试图创建连接的应用程序,一般称为客户端,等待连接的程序,一般称作服务器。图24.10给出了使用三次握手进行连接创建过程以及创建连接过程中数据的关键字段。连接创建过程的三次握手如下:

  1.客户端发送第一个片段,称作SYN片段,片段中设置了SYN位为1。该片段用于序列号的同步。客户端随机生成一个数作为初始序列号(ISN),然后发送到服务器。需要注意的是,该片段没有包括应答号,也没有定义窗口大小,当片段中的应答号存在是,窗口大小定义才有效。SYN片段为控制片段,没有携带数据,但是,它还是会消耗一个一个序列号,因为它需要被服务器应答,实际中可以认为SYN片段携带一个虚拟的字节。

  2.服务器发送第二个片段,SYN+ACK片段,同时该片段中SYN和ACK位都设为1。该片段有两个目的,第一是初始化从服务端到客户端的通讯,该片段初始化了一个序列号,来记录由服务端发向客户端的的字节号。第二个目的是应答了客户端发送的SYN片段,同时向客户端说明了下一个要接受的片段的序列号。因为数据包需要被应答,所以需要定义接收接收窗体的大小(rwnd)。该片段也需要消耗一个序列号。

  3.客户端发送第三个片段,ACK片段,这个仅仅是应答片段,应答第二个片段的接收。该字段设置ACK位为1。需要注意的是,该片段如果没有携带数据时,不需要消耗序列号。该字段允许携带从客户端发送服务端的数据信息,当携带数据时,需要消耗序列号。

数据传输(data transfer)

  连接创建之后,就可以进行数据传输了。需要注意的问题是,数据传输过程中,如果发送方设置了PUSH位,意味着接收方要尽快的把数据提交到应用层,而不需要等待缓冲区满或者更多数据到来。

连接终止(Connection Termination)

  交换数据的双方都可以关闭连接,虽然关闭连接请求往往由客户端初始化。如今很多TCP实现允许两种终止连接方式:三次握手(图24.12)和半关闭的四次握手(图24.13)。

  三次握手(Three-Way Handshaking)

  1.客户端TCP在接收到客户端应用的断开连接命令后,向服务器发送第一个片段,称作FIN片段,该片段中FIN标志位设为1,FIN片段可以携带最后发送给服务器的数据信息,也可以不携带任务信息,仅仅作为一个控制片段。如果是控制片段,就需要消耗一个序列号。

  2.服务器TCP接收到FIN片段后,向上层应用通知连接断开,然后发送第二个数据片段,FIN+ACK片段,一方面是中断服务器向客户端发送数据的连接,另一方面是告知客户端已接收到FIN片段。FIN+ACK片段可以携带最后发送给客户端的数据信息,也可以不携带任务信息,仅仅作为一个控制片段。如果是控制片段,就需要消耗一个序列号。

  3.客户端TCP发送最后一个片段,ACK片段,证实接收到了FIN+ACK片段,该片段包括应答号,但不携带数据,不消耗序列号。

半关闭(Half-Close)

  TCP中,一方可以停止发送数据的同时仍然接收对方发送的数据,这种方式称作半关闭。服务端和客户端都可以发出半关闭请求。半关闭发生在接收方需要接受所有数据之后,交给上层处理,然后再把数据发送给发送方,发送方发完数据之后就可以请求半关闭了。一个比较容易理解的例子就是排序,客户端向服务器发送要排序的数组,服务器把要排序的数据全部接收后,交给上层应用排序好之后,再把排序好的数据发送给客户端,客户端发送完数据之后,就可以发送半关闭的请求了。图24.13就表示了半关闭过程。

数据通讯与网络 第五版第24章 传输层协议-TCP协议部分要点的更多相关文章

  1. 数据通讯与网络 第五版第24章 传输层协议-UDP协议部分要点

    24.1 介绍 本章节主要集中于传输层协议的解读,图24.1展示TCP.UDP.SCTP在TCP\IP协议栈的位置 24.1.1 服务(Service) 每个协议都提供不同的服务,所以应该合理正确的使 ...

  2. 网络通信协议八之(传输层)TCP协议详解

    传输层协议 分段是为了提高传输效率,封装是指给每个数据段添加一个编号 端到端的传输是逻辑上的端到端,并不是真正意义上的发送方某层与接收方某层之间的传输 IP协议只是保证数据报文发送到目的地,为主机之间 ...

  3. Linux内核--网络栈实现分析(九)--传输层之UDP协议(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7549340 更多请查看专栏,地 ...

  4. Linux内核--网络栈实现分析(五)--传输层之UDP协议(上)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7532512 更多请看专栏, ...

  5. TCP/IP(五)传输层(TCP的三次握手和四次挥手)

    前言 这一篇我将介绍的是大家面试经常被会问到的,三次握手四次挥手的过程.以前我听到这个是什么意思呀?听的我一脸蒙逼,但是学习之后就原来就那么回事! 一.运输层概述 1.1.运输层简介 这一层的功能也挺 ...

  6. UNIX网络编程---传输层:TCP、UDP、SCTP(二)

    UNIX网络编程----传输层:TCP.UDP.SCTP 一.概述 本章的焦点是传输层:包括TCP.UDP.和SCTP(流控制传输协议).SCTP是一个较新的协议,最初设计用于跨因特网传输电话信令. ...

  7. [网络编程之客户端/服务器架构,互联网通信协议,TCP协议]

    [网络编程之客户端/服务器架构,互联网通信协议,TCP协议] 引子 网络编程 客户端/服务器架构 互联网通信协议 互联网的本质就是一系列的网络协议 OSI七层协议 tcp/ip五层模型 客户端/服务器 ...

  8. C primer plus 第五版十二章习题

    看完C prime plus(第五版)第十二章,随带完成了后面的习题. 1.不使用全局变量,重写程序清单12.4的程序. 先贴出12.4的程序,方便对照: /* global.c --- 使用外部变量 ...

  9. 【知识强化】第五章 传输层 5.3 TCP协议

    这节课我们来学习一下TCP协议的特点以及TCP报文段的格式. 首先呢我们来看一下TCP有哪些特点呢.之前我们说过TCP它是一个比较可靠的面向连接的协议,所以最主要的特点它是可以面向连接的一种传输层协议 ...

随机推荐

  1. 一个ROS的服务,使机器人向前移动指定距离

    源代码有点长,放文末链接里了. 服务描述及代码现在的服务是:请求时携带要前进的距离,然后底盘前进相应距离.代码如下,改动很小: #!/usr/bin/env python import rospyfr ...

  2. Python3:numpy模块中的argsort()函数

    Python3:numpy模块中的argsort()函数   argsort函数是Numpy模块中的函数: >>> import numpy >>> help(nu ...

  3. 关于预测io调用的思考

    什么是预测io 预测io是linux2.6版本内核调用默认的调用程序,对应用程序进行跟踪,统计应用程序使用io情况,在读操作返回之前先停顿6ms时间(linux默认时间),如果这期间有读操作过来,可以 ...

  4. BZOJ 1614 USACO 07Jan. 洛谷1948 电话线

    二分+特殊姿势的check:二分最小代价P,把边权小于等于P的边设为0,其他的设为1,跑一遍最短路,判断dis[n]是否大于K #include<cstdio> #include<a ...

  5. 【[Offer收割]编程练习赛 14 B】投掷硬币

    [题目链接]:http://hihocoder.com/problemset/problem/1506 [题意] 中文题 [题解] 这种题是概率DP-. 设f[i][j]表示i个硬币里面有j个正面朝上 ...

  6. Java基础学习总结(41)——JPA常用注解

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.         JPA由EJB 3.0软件专 ...

  7. Java SE 之 递归方法

    public void removeSon(String id, List<Dept> deptList) { String hql = "from Dept where par ...

  8. noip模拟赛 浮游大陆的68号岛

    题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无虑的,幼体的黄金妖精们过着天真烂 ...

  9. 激活Windows

    额外的启动参数(键):/win=act – 在隐藏模式下运行程序,激活 Windows 并退出程序./ofs=act – 在隐藏模式下运行程序,激活 Office 并退出程序./wingvlk – 在 ...

  10. asp.net--解决上传文件大小限制

    原文地址 第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRuntime节点 对于asp.net,默认只允许上传4M文件,增加如下配置,一般可以自定义最大文件大 ...