一、前言:

 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. 快速可靠网络传输协议 KCP(转)

    KCP 是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低三倍的传输效果.纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定 ...

  2. mongodb基础学习5-索引

    下面来看看索引,有btree索引和hash索引,会提高查询速度,但降低了写入速度,可以按升,降序建立 包括单列索引,多列索引,子文档索引,也可分为普通索引,惟一索引,稀疏索引,hash索引(2.4新增 ...

  3. oracle启动过程

    Oracle  的启动需要经历四个状态,SHUTDOWN .NOMOUNT .MOUNT .OPEN. SHUTDOWN状态                                       ...

  4. Linux安装初始化

    鸟哥的Linux 私房菜 Linux常用命令大全     http://www.cnblogs.com/yjd_hycf_space/p/7730690.html 安装看锋哥教程   可能最后网卡出错 ...

  5. Java Thread.interrupt interrupted

    Java Thread.interrupt @(Base)[JDK, 线程, interrupt] 原文地址,转载请注明 下面这个场景你可能很熟悉,我们调用Thread.sleep(),conditi ...

  6. JAVA中会存在内存泄露吗

    所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中.java中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉.由于Jav ...

  7. HTML CSS + DIV实现整体布局 part1

    HTML CSS + DIV实现整体布局 1.技术目标: 开发符合W3C标准的Web页面 理解盒子模型 实现DIV+CSS整体布局 2.什么是W3C标准? W3C:World Wide Web Con ...

  8. 疯狂JAVA——第八章 java集合

    集合类主要负责保存.盛装其他数据,因此集合类也被称为容器类. 数组元素既可以是基本类型的值,也可以是对象(实际上是保存的对象的引用): 集合里只能保存对象.

  9. rsa 公钥 私钥

    如果用于加密解密,那就是用公钥加密私钥解密(仅你可读但别人不可读,任何人都可写)如果用于证书验证,那就是用私钥加密公钥解密(仅你可写但别人不可写,任何人都可读) 最后,RSA的公钥.私钥是互相对应的. ...

  10. tf.get_variable()

    1. tf.Variable()W = tf.Variable(<initial-value>, name=<optional-name>)1用于生成一个初始值为initial ...