3、TCP协议

从上一节我们了解了什么是IP协议,以及IP协议的一些特性,利用IP协议传输都是单向的,不可靠的,无连接状态的。正是这些特性,于是便产生了TCP协议。TCP协议属于传输层,在IP协议网络层之上,竟然IP协议不可靠,那就必须要在其上多一个TCP协议以实现传输的可靠性。就像我们寄出一封信,如果对方不回信,不通过别的渠道告诉你,你永远都无法保证这封信能准确送到对方手上。同样,TCP协议采取了类似的措施来保证数据包的准确送达,它规定接收端发送一个确认数据包回来。

严格地说,TCP协议提供了可靠、全双工、流式和无结构传输服务。它通过两种技术达到可靠性——积极确认和重发送。接收端在收到发送者发送的数据后,必须发送一个相应的确认消息(ACK),告诉发送到我已经收到这个数据包。对于超时丢失的数据包,TCP会重新发送这个数据包。

TCP报文以IP报文为载体,嵌套在IP报文里面。图2-2-3-1展示了TCP报文格式。源端口跟目的端口肯定就是描述“从哪个端口来,到哪个端口去”。序号用于标识发送的顺序数,对所有通过TCP传输的的字节进行统计。确认序号则表示哪些序号的数据包已经成功接收。这里重点讲这个ACK位,这个标记位用于确认接收,初始化一个连接用SYN+ACK组合,关闭一个连接用ACK+FIN组合。校验和则用于验证数据包的正确性。其他字段不再赘述,可以查找相关资料了解。

图2-2-3-1 TCP协议报文

TCP协议连接的建立是通过三次握手完成的,这是TCP的重要内容,有必要深入理解,图2-2-3-2为TCP建立连接图示,假设从客户端发起连接请求,首先客户端会把SYN标志置位,同时初始化一个发送序列号,插入TCP报头的序列号区域,一起发给服务器;服务器收到该TCP分段后,把ACK标志置位,并初始化一个序列号,同时把接收到的客户端的发送序号加一,作为确认序号发送给客户端,告知客户端之前发送的数据我都收到了;最后,确认收到服务器的TCP分段,将ACK标志置位,并把服务器发来的发送序号加一返回给服务器。目前为止,TCP连接已经完整建立,可以开始全双工模式的数据传输了。

图2-2-3-2 TCP协议连接建立

建立连接后,如果不传输数据了,就要把连接关闭,由于TCP存在半关闭状态,所以TCP的连接关闭要通过四次握手完成的。如图2-2-3-3,TCP连接是全双工传输(两个方向能同时传输数据),每个方向必须要单独对其进行关闭。客户端的应用程序发送关闭命令给TCP,TCP发送完尚未处理的报文后,不在受理客户端应用程序的数据发送,并且发送附带发送序号、确认序号、ACK=1、FIN=1等字段的报文到服务器端,服务器端发送确认信息给客户端,接着服务器向客户端发送FIN报文,客户端回以确定信息。为了避免客户端的确认报文丢失服务器重传报文对新连接的干扰,客户端会等待一段时间才关闭连接。通过这样四次握手,完成关闭连接。

图2-2-3-3 TCP协议连接关闭

最后简单总结一下,TCP协议有以下几个特点:

①  TCP通过确认机制来保证数据包传送的可靠性。

② TCP通过CRC校验机制来保证数据包传输的无差错性。

③ TCP会重新排序乱序的数据包和丢弃重复的数据。

④ TCP能够提供流量控制机制,使用滑动窗口算法。

⑥ TCP能协商发送的数据报文长度。

喜欢研究java的同学可以交个朋友,下面是本人的微信号:

协议系列之TCP协议的更多相关文章

  1. 协议系列之TCP/IP协议

    根据前面介绍的几种协议,将IP协议.TCP协议.UDP协议组合起来,于是便有了TCP/IP协议.现在很多的应用的通信都是建立在TCP/IP协议的基础上,运用非常广泛,很有必要对其学习一下. 打个不太恰 ...

  2. 协议系列之UDP协议

    上节说的TCP协议虽然提供了可靠的传输,但是也有一个缺点,发送速度慢.那么有没有一种协议能快速发送的呢?这节要讨论的就是UDP协议,它提供了更加快的发送速度,但也牺牲了可靠性,它是一种无连接的传输协议 ...

  3. 网络编程(二)——TCP协议、基于tcp协议的套接字socket

    TCP协议与基于tcp协议的套接字socket 一.TCP协议(流式协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的 ...

  4. Python基础系列讲解——TCP协议的socket编程

    前言 我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP ...

  5. 协议系列之HTTP协议

    什么是HTTP\HTTPS HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.HTTP协议用于从WWWserver传输超文本到本地浏览器的传输协议,它能使浏览 ...

  6. 协议系列之IP协议

    1.协议 协议(protocol)的定义:为计算机网络中进行数据交换而建立的规则.标准或约定的集合.两个终端相互通信时双方达成的一种约定,规定了一套通信规则,双方通信必须遵守这些规则.这些规则规定了分 ...

  7. 网络编程(二)--TCP协议、基于tcp协议的套接字socket

    一.TCP协议(Transmission Control Protocol 传输控制协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会 ...

  8. Android网络编程系列 一 TCP/IP协议族之传输层

    这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 传输层中有TCP协议与UDP协议. 1.UDP介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,U ...

  9. TCP协议握手与分手

    TCP(Transmission Control Protocol) 传输控制协议 TCP的7次握手可以理解为3次握手和4次分手. TCP状态转换图,如下: 这个图N多人都知道,它对排除和定位网络或系 ...

随机推荐

  1. nodejs和vue的那些事

    nodejs >1.旨在提供一种简单的构建可伸缩网络程序的方法 官方网站:http://nodejs.cn/api/ Node.js 是一个基于Chromev8 JavaScript 运行时建立 ...

  2. [SCOI 2011]糖果

    Description 题库链接 给出 \(N\) 个节点,节点有正点权, \(K\) 个三元组 \((X,A,B)\) 来描述节点点权之间的关系. 如果 \(X=1\) , 表示 \(A\) 的点权 ...

  3. [APIO2016]划艇

    题目描述 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 NNN 个划艇学校,编号依次为 111 到 NNN.每个学校都拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划艇 ...

  4. hdu 4630 查询[L,R]区间内任意两个数的最大公约数

    No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. hihocoder 1035 : 自驾旅行 III

    描述 给定一棵含有 n 个结点的树,结点从 1 标号.你从 1 号结点驾车出发,希望遍历一些关键结点(访问到就好,不需要按照这些关键结点的输入顺序).每条边有两个权值,c0, c1 分别表示步行和驾车 ...

  6. 习题9-4 uva 1630

    题意: 给你一串数字,要求你对其进行折叠使其长度最短. 折叠情况:全是一个字母 & 重复的字符串 AAAAAAAAAABABABCCD    -->   9(A)3(AB)CCD NEE ...

  7. CAN通信要注意的问题

    CAN通信要注意的问题主要有: 1.参数配置 在初始化.启动.发送.接收 CAN信息时都要对CAN卡进行参数配置: (1)CAN卡的选择,我用到的是周立功的PCIE-9221,也就是DevType设备 ...

  8. Java web 前端面试知识点总结

    经过几家大厂面试,目前成功拿到唯品会offer,分享一下我的面试知识点总结: 耦合性:也称块间联系.指软件系统结构中各模块间相互联系紧密程度的一种度量.模块之间联系越紧密,其耦合性就越强,模块的独立性 ...

  9. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

  10. 入口开始,解读Vue源码(一)-- 造物创世

    Why? 网上现有的Vue源码解析文章一搜一大批,但是为什么我还要去做这样的事情呢?因为觉得纸上得来终觉浅,绝知此事要躬行. 然后平时的项目也主要是Vue,在使用Vue的过程中,也对其一些约定产生了一 ...