一、前言:

 TCP协议和UDP协议是网络编程里最重要的协议,很多新出的技术、新出的协议本质上都是基于这两个协议的,其中又以TCP协议居多;比如HTTP协议就是基于TCP协议的,应用程序和数据库交互也是通过TCP协议传输数据,还有一些比较偏的如S7协议也是基于TCP协议;理解TCP协议对我们学习新的技术有直达底层的效果,它可以令我们不被各种新技术的名称给吓唬住,因为我们理解了TCP协议后能够明白一个最根本的道理:无论采用了什么技术,只要是通过网络传输,且底层是TCP协议来传输数据,那么无非就是传输的数据具有一定的格式,比如XML格式(SOAP协议就是如此),或者发送的数据存在先后顺序,比如必须先发送A数据,得到应答消息后再发送B数据,之后才发送真实数据,发送完真实数据再发送结束发送的标志如EOF,又或者数据里存在开始标记和结束标记这样的特殊数据(标记数据可通过转义实现传输)等等。

 TCP协议的传输是可靠传输,它具有流的特点;即对于TCP应用而言,收到的数据一定是按对方发送的先后排列的,如果收到了开头标志和结尾标志则能够百分百保证收到的数据是完整无误的;但是仍要自己判断是否也收到了结尾标志。

 TCP是全双工通信,即TCP协议的应用可以同时发数据和接收数据,还可以只关闭单方通信,如不再发数据但是可以接收数据。

二、理解TCP协议的好处:

1.对于新出的基于网络的协议能够直接了解其本质,即底层通过TCP协议传输数据,无非就是传输的真实数据要么需要加密,要么就是以特殊格式传输,要么就是要先传输一些验证信息等等;比如以前我学HTTP协议,那时候不知道HTTP协议其实就是通过TCP协议实现,即以TCP协议传输特殊格式的数据:请求行、请求头、请求体,请求行里可以是哪些数据,请求头里可以是哪些数据,请求体里可以是哪些数据。

2.对于编程里涉及到的概念能够比较好的理解,比如数据库连接池;在比较早之前我对数据库连接池只知道它能够重用数据库连接,但是不知道这个连接是怎么重用的,以及为什么可以重用;后来知道和数据库服务交互其实就是通过TCP协议将符合条件的数据发给数据库服务即可,比如Java应用里通过Statement执行查询语句,其实就是通过Connection(基于TCP协议的应用)发送一些数据给MySQL服务而已;而数据库连接池就可以大致理解为Socket对象在和MySQL服务建立连接后(MySQL服务启动后会有Socket对象绑定IP端口、设置backlog并接受请求处理来自客户端的数据),发送连接数据给TCP的Socket(MySQL服务),由MySQL验证后返回一个token给Connection对象,然后此Connection对象即处于登录状态;之后通过发送如select的信息和携带token来执行查询操作;在数据库连接池的Connection对象在发送完数据后可以不close(已被缓存),下一个需要执行如delete语句的地方获得的Connection对象则可以是之前的那个,这样就能够节省清理Connection、开辟Connection、建立连接、登录等一系列的动作的消耗。

3.无疑还有好多好多。。

三、三次握手:

TCP协议建立连接需要进行三次握手,这里假设C是客户端,S是服务端,由客户端向服务端发起连接请求:

第一次握手:C->S,客户端向服务端发送连接请求的数据(这个数据可以理解为问服务端是否可以接收到数据)。

第二次握手:S->C,服务端发送应答消息给客户端,同时 询问客户端是否可以收到数据。(第二次握手并非是第一次握手成功就立刻执行的,要看服务端的处理策略,对应代码可以理解为backlog是否已满是否accept)

第三次握手:C->S,客户端告诉服务自己这边可以收到数据(可能会携带真实数据),服务端收到。(此时完整的TCP连接建立,注意这个连接建立是基于双方都知道对方能够收到自己的数据的前提下,然后任意一方就可以开始发送真实数据了)

总结:三次握手最主要的目的是确认  双方都知道对方  可以收到自己的数据,在这个前提下  任意一方  可以开始发送真实数据。

四、四次挥手:

这里假设是S发起close请求:

第一次挥手:S->C,S告诉C自己已经发送完毕,请求关闭连接。

第二次挥手:C->S,C收到S的请求后立刻发送应答消息给S让S等待自己发送  数据发送完毕  的消息,然后通过TCP应用询问是否还有未发完的数据。(这步比较特别,它有个和应用层交互的过程,这也是为什么二三步不合并的原因,三次握手的第二次其实是二三步合并的结果)。

第三次挥手:C->S,C得到应用层传来的  数据发送完毕  的消息后(在此之前TCP一直在传输数据给远端),发送消息给S通知对方自己已经没有数据要发送了。

第四次挥手:S->C,收到第三次挥手的消息后给C一个应答消息,然后进入等待状态,过一定时间C都  没有再次发送第三次挥手  的消息(说明C收到了第四次挥手的消息而直接关闭连接了,如果C没有收到则它认为自己的第三次挥手消息发送失败从而再次发送,而C收到第四次挥手消息则C此时知道S不再发数据,也知道S知道自己也不再发数据,故关闭连接)  则S关闭连接。

总结:这里能够close的前提是:知道对方不再发数据,同时知道  对方知道  自己知道对方  不再发数据,同时自己不再发数据,同时知道  对方知道自己  不再发数据,这三点满足则可以close。

四次挥手里给出了另一种应答方式:以前都是A->B,然后B应答,从而A知道B收到了,这里第四次挥手则是通过A->B,如果B没有收到则B会再次询问A,如果一定时间内

B没有再次询问则也说明B收到了消息(否则就是死循环了)。

TCP协议理解的更多相关文章

  1. Http协议与TCP协议理解

    TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...

  2. Http协议与TCP协议理解(转载的)

    TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...

  3. [转载] TCP协议缺陷不完全记录

    原文: http://www.blogjava.net/yongboy/archive/2015/05/07/424917.html tcp是一个非常复杂并且古老的协议, 之前教科书上将的很多东西应用 ...

  4. TCP协议可靠性数据传输实现原理分析

    http://blog.csdn.net/chexlong/article/details/6123087 TCP 协议是一种面向连接的,为不同主机进程间提供可靠数据传输的协议.TCP 协议假定其所使 ...

  5. Http协议与TCP协议简单理解(转)

    在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上 ...

  6. Http协议与TCP协议简单理解

    TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...

  7. TCP 协议中MSS的理解

    在介绍MSS之前我们必须要理解下面的几个重要的概念.MTU: Maxitum Transmission Unit 最大传输单元MSS: Maxitum Segment Size 最大分段大小PPPoE ...

  8. tcp协议中mss的理解

    在介绍MSS之前我们必须要理解下面的几个重要的概念.<blockquote>MTU: Maxitum Transmission Unit 最大传输单元MSS: Maxitum Segmen ...

  9. TCP/IP协议理解

    TCP/IP协议理解 一.    协议分层 由于ISO标准中的网络模型是个7层模型,但是由于7层模型对于当时的网络厂商来说太过复杂,很多厂家采用了简化的4层模型来实现网络设备,4层模型也就成了事实的网 ...

随机推荐

  1. git创建仓库,并提交代码(第一次创建并提交)(转)

    一直想学GIT,一直不曾学会.主要是GUI界面的很少,命令行大多记不住.今天尝试提交代码,按GIT上给的方法,没料到既然提交成功了. 于是把它记下来,方便以后学习. 代码是学习用的,没多大意义: 下图 ...

  2. C# 窗口页面卡的处理方案-异步编程委托

    今天用winform做了一个小程序,主要是用于远程数据的登录采集,因为数据量非常大,到时每次点击按钮执行程序的时候界面都会出现假死状态,具体表现是无法拖动窗口,无法最小化或关闭等,只能任务管理进程结束 ...

  3. SSL原理分析

    SSL协议的工作流程: 服务器认证阶段:       1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接:      2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则 ...

  4. Kuberentes-入门

    一.kubernetes架构介绍和集群规划 点击链接查看: 系统环境初始化:https://www.cnblogs.com/hwlong/p/9105742.html 二.CA证书创建和分发 点击链接 ...

  5. 利用redis完成自动补全搜索功能(一)

    最近要做一个搜索自动补全的功能(目前只要求做最前匹配),自动补全就是自动提示,类似于搜索引擎,再上面输入一个字符,下面会提示多个关键词供参考,比如你输入 nb 2字符, 会自动提示nba,nba录像, ...

  6. Linq和EF 做 单一条件查询 和 复合条件 查询 以及 多表 联合查询 示例

    单一条件查询: var table2Object = (from t1 in db.table1 join t2 in db.table2 on t1.id equals t2.id select t ...

  7. centos7之iptables与firewalld

    保障数据的安全性是继保障数据的可用性之后最为重要的一项工作.防火墙作为公网 与内网之间的保护屏障,在保障数据的安全性方面起着至关重要的作用. firewalld与iptables iptables f ...

  8. AOP不起作用的原因之一

    在-servlet.xml配置context:component-scan后,Spring在扫描包时,会将所有带 @Service注解的类都扫描到容器中.而-servlet.xml和applicati ...

  9. RNA-seq连特异性

    RNA-seq连特异性 Oct 15, 2015 The strandness of RNA-seq analysis 前段时间一直在研究关于illumina TrueSeq stranded RNA ...

  10. python性能测试大致计划

      hi guy: 如果注意到创建时间,那就对了.这份文章,是我学习Python一个月以后动手写的.   写下这份计划以后,只完成了第一步,其中磕磕绊绊编写代码的过程,很大一部分时间是完全用txt写的 ...