3. 传输控制协议(TCP)

3.1 TCP协议的主要特点

(1)TCP是面向连接的传输层协议。即使用TCP协议之前必须先建立TCP连接。在传送数据完毕之后,必须释放己经建立的TCP连接。

(2)每一条TCP连接只能有两个端点,即只能是一对一的。

(3)TCP提供可靠交付服务,也就是说通过TCP连接传送的数据,无差错、不丢失、不重复且按序发送。

(4)TCP提供全双工通信。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。这就允许通信双方在任何时候都可以发送数据。

(5)面向字节流

  ①TCP中的“流”是指流入到进程或从进程流出的字节序列。“面向字节流”的含义是:是指TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。它并不知道所传送的字节流的含义(如是一个整型或自定义的结构体),其含义由应用层的接收双方自行协商的,但到了传输层其意义就不存在了

  ②UDP发送的报文长度是应用程序给了的。但与UDP不同,如果应用程传送到TCP缓存的数据块太长,TCP就会把它划分得短一些再传送。如果应用程序一次只发一个字节,TCP会等待积累到足够多字节后再构成报文发送出去。一个TCP报文段的大小,只是根据对方给出的窗口值和当前网络的拥塞程度来决定的。

3.2 TCP报文的首部格式

(1)抓包分析TCP

(2)TCP首部

  ①TCP报文分为首部和数据两个部分。TCP的全部功能都体现在它首部的各个字段的作用,只有弄清首部各字段的作用才能掌握TCP的工作原理。

  ②TCP首部的前20个字节是固定的,后面的4N个字节是根据需要而增加的(N为整数),因此TCP首部的最小长度是20字节。

3.3 TCP首部各字段含义

(1)源端口和目的端口:各占2个字节。和UDP一样,使用端口号来标识不同的应用层协议。

(2)序号:占4个字节,共232个序号,序号从0开始,增到最大时,下一个序号会循环回到0。一个TCP连接中传送的字节流的每一个字节都按顺序编号。而序号字段表示本报文段所发送的数据的第一个字节的序号。

(3)确认号:占4个字节,是期望收到下一个报文段的第一个数据字节的序号应记住:若确认号为N,则表明到序号N-1为止的所有数据都已正确收到

(4)数据偏移:占4位二进制,单位是4字节。它指出TCP报文段的数据起始处距离TCP报文段的起始的偏移,实际上就是指出TCP报文段的首部长度。

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

(6)紧急URG(Urgent)。当URG=1时,表示紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序传送。(注意,该标志位只是告诉TCP,优先发送本报文段。但接收方是否优先把该数据报尽快交付(推送)给应用程序是由push标志位来决定的)

(7)确认ACK(Acknowlegment)当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。

(8)推送(Push):当两个应用进程进行交互的通信时有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。(即接收方优先接收这个数据包,就优先交付给其上的应用程序,而不再等到整个缓存都填满后再向上交付!)。实际中很少使用该字段。

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

(10)同步SYN(Synronization):在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使用SYN=1和ACK=1。因此,SYN置1就表示这是一个连接请求或连接接受报文

(11)终止FIN(Finish)用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据己发送完毕,并要求释放传输连接。

(12)窗口 。占2个字节。窗口值是[0,216-1]之间的整数,主要起着流量控制的作用。其意义在于告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(单位是字节)。

  ①由于TCP的确认机制也让TCP连接双方的数据传输速度变慢,也就是说,一方发送数据需要等待对方的确认才继续发送后续数据。为了充分利用双方的带宽及缓冲区(Buffer),发送方不必等待对方的确认,可以连续发送多个数据包给对方,而对方可以暂时把这些数据存放在缓冲区,并给对方一个总确认。这样,可以大大增加数据传输的速度

  ②可见,之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。使用TCP协议传输数据的计算机会根据自己的接收能力让对方参数这个窗口值来调整数据发送的速率,从而达到流量控制的功能。

(13)检验和。占2个字节。检验的范围包括首部和数据这两个部分。其检验方法与UDP类似,也要临时添加一个伪首部。只是伪首部的第4个字段的17改为16,第5个字段的UDP长度改为TCP长度。若使用IPv6,则伪首部也要相应的改变。

(14)紧急指针。占2个字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),由于紧急数据是从数据部分的开始处算起,因此,紧急指针也是紧急数据的长度。

(15)选项:长度可变,最长可达40个字节。当没有使用选项时,TCP的首部长度是20个字节。该选项中通常可以设置MMS、窗口扩大选项和时间戳等。

  ①TCP最长报文段长度(MMS),并不是整个TCP报文段的最大长度,而是数据字段的最大长度

  ②受数据链路层最大传输单元(MTU)的限制,以太网的MTU默认是1500字节。因此TCP报文段数据部分的最大长度(MMS)为1460字节

  ③若选择较小的TCP报文段太小,则网络的利用率就低反之,如果TCP报文段太长,那么在IP层就可能被分解成多个短数据报片,当传输出错时要进行重传以及到达终点还要还原成原来的TCP报文,这些都会使网络开销增大

  ④因此,MMS应尽可能设置大些,只要在IP层传输时不需要再分片就行。若主机未填写MMS,默认为536字节。因此所有因特网上的主机都应能接受的报文长度是536+20(固定首部长度)=556字节。

第8章 传输层(3)_TCP协议的更多相关文章

  1. 第8章 传输层(1)_TCP/UDP协议的应用场景

    1. 传输层的两个协议 1.1 TCP和UDP协议的应用场景 (1)TCP协议:如果要传输的内容比较多,需要将发送的内容分成多个数据包发送.这就要求在传输层用TCP协议,在发送方和接收方建立连接,实现 ...

  2. 第6章 传输层(详解TCP的三次握手与四次挥手)

    第6章 传输层 传输层简介 传输层为网络应用程序提供了一个接口,并且能够对网络传输提供了可选的错误检测.流量控制和验证功能.TCP/IP传输层包含很多有用的协议,能够提供数据在网络传输所需的必要寻址信 ...

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

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

  4. 传输层:TCP 协议

    传输层:TCP 协议 一.概述 TCP 和 UDP 处在同一层——运输层,但是它们有很多的不同.TCP 是 TCP/IP 系列协议中最复杂的部分,它具有以下特点: (1) TCP 提供 可靠的 数据传 ...

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

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

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

    上一博客记录了UDP协议的关键要点,这部分记录TCP协议的关键要点. 24.3 传输控制协议(TRANSMISSION CONTROL PROTOCOL) TCP(Transmission Contr ...

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

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

  8. 【知识强化】第五章 传输层 5.2 UDP协议

    这节课我们来学习一下UDP协议. 那在上节课呢我们学了这样一个打油诗. 啊,就是传输层有两个好兄弟,大哥TCP和二弟UDP.大哥很靠谱,二弟不靠谱.那只要说到UDP协议我们就要知道它的一个重要的特点, ...

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

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

随机推荐

  1. VS打包项目详细解析

       使用VS打包项目,其实很多简单.微软官方文档很详尽,故不再细述,只列出相关链接 1创建安装项目 如何:创建或添加部署项目 2 添加项目输出 如何:向部署项目中添加项 3添加用户界面 部署中的用户 ...

  2. mysql为int类型的字段php取出来之后为何变为string类型?

    https://segmentfault.com/q/1010000002957162 php从mysql取出int数据,变成了string https://blog.csdn.net/as17501 ...

  3. out, ref 和 params 的区别和用法

    1. out 参数. 如果你在一个方法中,返回多个相同类型的值,可以考虑返回一个数组. 但是,如果返回多个不同类型的值,返回数组就不可取.这个时候可以考虑使用out参数. out参数就侧重于在一个方法 ...

  4. 列表(list)的增删改查

    list 可以通过 索引,切片,切片加步长取出列表中的某个元素 列表的增: # 追加 append() 在列表的后面追加元素 #  插入 insert()在列表的某个位置插入元素  会加在你输入位置的 ...

  5. 3、eclipse集成svn

    手动安装 1.从官网下载适合自己开发工具的site-.zip文件,网址是:subclipse.tigris.org,2.从中解压出features与plugins文件夹,复制到eclipse的目录my ...

  6. SQL Server Profiler 怎么创建trace来收集sql log(.trc文件)

    1.  先安装SQL Server 2008 R2或其他版本的数据库. 2.  打开profiler, 选择新建一个trace,连接到要监控的SQL Server数据库实例. 打开 SQL Serve ...

  7. Sqoop 介绍、安装及环境配置

    一.Sqoop Sqoop介绍 Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.oracle...)间进行数据的传递,可以将一个关系型数据库中的数据导进到Ha ...

  8. 三重DEC加密在java中的实现

    代码可以直接拷走使用,一些约定例如向量可以自行变动 引言      如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在android.ios.java平台 ...

  9. 解决openwrt中文界面异常

    openwrt的luci以中文字体显示时,出现以下异常情况: 是因为该固件编译了其他的luci application,我是编译了meshwizard. 可作如下修改: scp登陆打开/usr/lib ...

  10. 信号滤波模块verilog代码---UNLOCK,LOCK状态机方式

    信号滤波模块verilog代码 `timescale 1ns / 1ps /////////////////////////////////////////////////////////////// ...