一、概述

TCP和UDP处在同一层——运输层,但是它们有很多的不同。TCP是TCP/IP系列协议中最复杂的部分,它具有以下特点:

  • (1) TCP提供 可靠的 数据传输服务,TCP是 面向连接的 。应用程序在使用TCP通信之前,先要建立连接,这是一个类似“打电话”的过程,通信结束后还要“挂电话”。

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

  • (3) TCP提供可靠传输,无差错、不丢失、不重复、按顺序。

  • (4) TCP提供 全双工 通信,允许通信双方任何时候都能发送数据,因为TCP连接的两端都设有发送缓存和接收缓存。

  • (5) TCP面向 字节流 。TCP并不知道所传输的数据的含义,仅把数据看作一连串的字节序列,它也不保证接收方收到的数据块和发送方发出的数据块具有大小对应关系。

二、TCP报文段结构

TCP是面向字节流的,而TCP传输数据的单元是 报文段 。一个TCP报文段可分为两部分:报头和数据部分。数据部分是上层应用交付的数据,而报头则是TCP功能的关键。

TCP报文段的报头有前20字节的固定部分,后面4n字节是根据需要而添加的字段。如图则是TCP报文段结构:

20字节的固定部分,各字段功能说明:

  • 1.源端口和目的端口:各占2个字节,分别写入源端口号和目的端口号。这和UDP报头有类似之处,因为都是运输层协议。

  • 2.序号:占4字节序,序号范围[0,2^32-1],序号增加到2^32-1后,下个序号又回到0。 TCP是面向字节流的,通过TCP传送的字节流中的每个字节都按顺序编号,而报头中的序号字段值则指的是本报文段数据的第一个字节的序号

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

  • 4.数据偏移:占4位,指TCP报文段的报头长度,包括固定的20字节和选项字段。

  • 5.保留:占6位,保留为今后使用,目前为0。

  • 6.控制位:共有6个控制位,说明本报文的性质,意义如下:

    **URG 紧急**:当URG=1时,它告诉系统此报文中有紧急数据,应优先传送(比如紧急关闭),这要与**紧急指针**字段配合使用。
    **ACK 确认**:仅当ACK=1时**确认号**字段才有效。建立TCP连接后,所有报文段都必须把ACK字段置为1。
    **PSH 推送**:若TCP连接的一端希望另一端立即响应,PSH字段便可以“催促”对方,不再等到缓存区填满才发送。
    **RET 复位**:若TCP连接出现严重差错,RST置为1,断开TCP连接,再重新建立连接。
    **SYN 同步**:用于建立和释放连接,稍后会详细介绍。
    **FIN 终止**:用于释放连接,当FIN=1,表明发送方已经发送完毕,要求释放TCP连接。
  • 7.窗口:占2个字节。窗口值是指发送者自己的接收窗口大小,因为接收缓存的空间有限。

  • 8.检验和:2个字节。和UDP报文一样,有一个检验和,用于检查报文是否在传输过程中出差错。

  • 9.紧急指针:2字节。当URG=1时才有效,指出本报文段紧急数据的字节数。

  • 10.选项:长度可变,最长可达40字节。具体的选项字段,需要时再做介绍。

三、连接的建立与释放

刚才说过,TCP是面向连接的,在传输TCP报文段之前先要创建连接,发起连接的一方被称为客户端,而响应连接请求的一方被称为服务端,而这个创建连接的过程被称为 三次握手 :

  • (1) 客户端发出请求连接报文段,其中报头控制位SYN=1,初始序号seq=x。客户端进入SYN-SENT(同步已发送)状态。

  • (2) 服务端收到请求报文段后,向客户端发送确认报文段。确认报文段的首部中SYN=1,ACK=1,确认号是ack=x+1,同时为自己选择一个初始序号seq=y。服务端进入SYN-RCVD(同步收到)状态。

  • (3) 客户端收到服务端的确认报文段后,还要给服务端发送一个确认报文段。这个报文段中ACK=1,确认号ack=y+1,而自己的序号seq=x+1。这个报文段已经可以携带数据,如果不携带数据则不消耗序号,则下一个报文段序号仍为seq=x+1

至此TCP连接已经建立,客户端进入ESTABLISHED(已建立连接)状态,当服务端收到确认后,也进入ESTABLISHED状态,它们之间便可以正式传输数据了。

当传输数据结束后,通信双方都可以释放连接,这个释放连接过程被称为 释放连接 :

  • (1) 此时TCP连接两端都还处于ESTABLISHED状态,客户端停止发送数据,并发出一个FIN报文段。首部FIN=1,序号seq=u(u等于客户端传输数据最后一字节的序号加1)。客户端进入FIN-WAIT-1(终止等待1)状态。

  • (2) 服务端回复确认报文段,确认号ack=u+1,序号seq=v(v等于服务端传输数据最后一字节的序号加1),服务端进入CLOSE-WAIT(关闭等待)状态。现在TCP连接处于半开半闭状态,服务端如果继续发送数据,客户端依然接收。

  • (3) 客户端收到确认报文,进入FIN-WAIT-2状态,服务端发送完数据后,发出FIN报文段,FIN=1,确认号ack=u+1,然后进入LAST-ACK(最后确认)状态。

  • (4) 客户端回复确认确认报文段,ACK=1,确认号ack=w+1(w为半开半闭状态时,收到的最后一个字节数据的编号) ,序号seq=u+1,然后进入TIME-WAIT(时间等待)状态。

注意此时连接还没有释放,需要时间等待状态结束后(4分钟) 连接两端才会CLOSED。设置时间等待是因为,有可能最后一个确认报文丢失而需要重传。

四、TCP可靠传输的实现

  • (1) TCP报文段的长度可变,根据收发双方的缓存状态、网络状态而调整。

  • (2) 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。

  • (3) 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。这就是稍后介绍的超时重传

  • (4) TCP将保持它首部和数据的检验和。如果通过检验和发现报文段有差错,这个报文段将被丢弃,等待超时重传。

  • (5) TCP将数据按字节排序,报文段中有序号,以确保顺序的正确性。

  • (6) TCP还能提供流量控制。TCP连接的每一方都有收发缓存。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

可见超时重发机制是TCP可靠性的关键,只要没有得到确认报文段,就重新发送数据报,直到收到对方的确认为止。

五、超时重传

TCP规定,接收者收到数据报文段后,需回复一个确认报文段,以告知发送者数据已经收到。而发送者如果一段时间内(超时计时器)没有收到确认报文段,便重复发送:

为了实现超时间重传,需要注意:

  • 1.发送者发送一个报文段后,暂时保存该报文段的副本,为发生超时重传时使用,收到确认报文后删除该报文段。

  • 2.确认报文段也需要序号,才能明确是发出去的那个数据报得到了确认。

  • 3.超时计时器比传输往返时间略长,但具体值是不确定的,根据网络情况而变。

六、连续ARQ协议

也许你也发现了,按上面的介绍,超时重传机制很费时间,每发送一个数据报都要等待确认。

在实际应用中的确不是这样的,真实情况是,采用了流水线传输:发送方可以连续发送多个报文段(连续发送的数据长度叫做窗口),而不必每发完一段就停下来等待确认。

实际应用中,接收方也不必对收到的每个报文都做回复,而是采用累积确认方式:接收者收到多个连续的报文段后,只回复确认最后一个报文段,表示在这之前的数据都已收到。

这样,传输效率得到了很大的提升。

七、流量控制和拥塞控制

由于接收方缓存的限制,发送窗口不能大于接收方接收窗口。在报文段首部有一个字段就叫做窗口(rwnd),这便是用于告诉对方自己的接收窗口,可见窗口的大小是可以变化的。

那么窗口的大小是如何变化的呢?TCP对于拥塞的控制总结为“慢启动、加性增、乘性减”,如图所示:

  • (1) 慢启动 :初始的窗口值很小,但是按指数规律渐渐增长,直到达到慢开始门限(ssthresh)

  • (2) 加性增 :窗口值达到慢开始门限后,每发送一个报文段,窗口值增加一个单位量。

  • (3) 乘性减 :无论什么阶段,只要出现超时,则把窗口值减小一半。

八、tcpdump抓取TCP报文段

学习途径:实验楼

实验:传输层:TCP协议的更多相关文章

  1. (传输层)TCP协议

    目录 首部格式数据单位特定注意自动重传请求ARQ具体实现发送缓存接收缓存滑动窗口确认丢失和确认迟到超时重传时间选择报文段的发送时机运输连接发送TCP请求客户端拥塞处理相关概念避免拥塞具体实现TCP 的 ...

  2. 传输层TCP协议

    目录 首部格式数据单位特定注意自动重传请求ARQ具体实现发送缓存接收缓存滑动窗口确认丢失和确认迟到超时重传时间选择报文段的发送时机运输连接发送TCP请求客户端拥塞处理相关概念避免拥塞具体实现TCP 的 ...

  3. OSI模型第四层传输层--TCP协议

    1.传输层2个协议tcp和udp 2.tcp的可靠性(挂号信). 面向链接的:类似寄挂号信,对方收到了并且能够确认.所以也是可靠的传输. 最大报文传输:两端可以协商传输报文大小.(协商一个报文的大小) ...

  4. 传输层tcp协议以及scoket套字节方法

    一.传输层 1.传输层的由来: 网络层的IP帮我们区分子网 以太网的Mac帮我们找到主机 所以通过IP和Mac找到了一台特定的主机 如何找到该特定主机的应用程序呢? 答案是通过端口,端口即应用程序与网 ...

  5. TCP/IP五层模型-传输层-TCP协议

    ​1.定义:TCP是一种面向连接.可靠的.基于字节流的传输控制协议. 2.应用场景:TCP为可靠传输,适合对数据完整性要求高,对延时不敏感的场景,比如邮件. 3.TCP报文:①TCP报文格式: ②TC ...

  6. [TCP/IP] 传输层-TCP和UDP的使用场景

    传输层-TCP和UDP应用场景 TCP(传输控制协议) 需要将要传输的文件分段传输,建立会话,可靠传输,流量控制 UDP(用户报文协议) 一个数据包就能完成数据通信,不需要建立会话,不分段,不用流量控 ...

  7. 我们检测到您的浏览器不兼容传输层安全协议 (TLS) 1.1 或更高版本,此协议在 Internet 上用于确保您通信的安全性。

    早上使用.Net WebClient类采集亚马逊数据,返回http 400 Bad Request错误,内容里面有“我们检测到您的浏览器不兼容传输层安全协议 (TLS) 1.1 或更高版本,此协议在 ...

  8. [转帖]传输层安全协议TLS 1.3 RFC 8446使互联网更快、更安全

    传输层安全协议TLS 1.3 RFC 8446使互联网更快.更安全 2018-08-12 11:38:19作者:LINUX人稿源:开源社区 https://ywnz.com/linuxyffq/261 ...

  9. 传输层-TCP

    UDP协议提供了端到端之间的通讯,应用程序只需要在系统中监听一个端口,便可以进行网络通讯.随着计算机网络的发展,计算机网络所承载的业务越来越多,有些业务数据的传输需要具备可靠性,譬如我们在进行在线聊天 ...

  10. OSI模型第四层传输层--UDP协议

    1.udp协议 UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成[2]  ,提供面向事务的简单不可靠信息传送服务.UDP 协议 ...

随机推荐

  1. NGUI 动态添加控件

    本文链接地址: Unity3D NGUI动态创建按钮 本例仅以熟悉NGUI组件功能为目的,想快捷简便的创建按钮或其它游戏物体请参考 “Unity3D 动态实例化Prefab” 以动态创建服务器列表为例 ...

  2. 用于软件包管理的21个Linux YUM命令 转载

    http://flycars001.iteye.com/blog/1949085 YUM到底是啥东东? YUM(Yellowdog Updater Modified)是一款开源命令行及图形化软件包管理 ...

  3. Gulp.js - 简单、直观的自动化项目构建工具

    Gulp.js 是一个简单.直观的构建系统.崇尚代码优于配置,使复杂的任务更好管理.通过结合 NodeJS 的数据流的能力,你能够快速构建.通过简单的 API 接口,只需几步就能搭建起自己的自动化项目 ...

  4. Android 学习笔记多媒体技术之 Drawable类+Tween(补间动画)+Frame(帧动画)

    学习内容: 1.了解Drawable类的作用 2.如何使用Drawable... 3.了解Tween动画... 4.如何创建和使用Tween动画... 1.Drawable类...   Drawabl ...

  5. 转载:全球首个微信小程序(应用号)开发教程!通宵吐血赶稿,每日更新!

    微信应用号(小程序,「应用号」的新称呼)终于来了! 目前还处于内测阶段,微信只邀请了部分企业参与封测.想必大家都关心应用号的最终形态到底是什么样子?怎样将一个「服务号」改造成为「小程序」? 我们暂时以 ...

  6. servlet中的细节

    Get方法有大小限制:1024个字符.这些信息使用 Query_String头传递,并通过Query_String环境变量访问.Post方法:请求体信息使用FromData头传递.读取所有表单参数:g ...

  7. Scrum4.0+5.0 数独游戏

    1.题目: 1.准备看板. 形式参考图4. 2.任务认领,并把认领人标注在看板上的任务标签上. 先由个人主动领任务,PM根据具体情况进行任务的平衡. 然后每个人都着手实现自己的任务. 3.为了团队合作 ...

  8. P6 EPPM 安装与配置指南 16 R1 2016.4

       关于安装和 配置P6 EPPM 本指南告诉你如何自动 安装和配置您的应用程序. 在您开始之前,阅读 先决条件 P6 EPPM配置 (7页). 安装P6 EPPM 您将使用 安装程序 (窗口) . ...

  9. Use the PDFs below or the HTML contents to the left to install and configure P6 EPPM and its additional components.

    Welcome to Your Documentation   Use the PDFs below or the HTML contents to the left to install and c ...

  10. 译:泛型List集合转化为DateTable的扩展方法

    译文出处:http://www.codeproject.com/Tips/867866/Extension-Method-for-Generic-List-Collection-to-Da 这段代码是 ...