一、前言:

 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. android中拷贝assets下的资源文件到SD卡中(可以超过1M)

    很多手机游戏,在安装APK之后都得需要下载相应的资源包,然后才能进入游戏. 有这样一个需求:就是游戏中需要的资源包打在APK内,随apk一起进行安装到手机中. 这样就不需要,在安装APK之后,去下载资 ...

  2. UI5-文档-导航栏

    UI5-文档-1-前言 UI5-文档-2-开发环境 UI5-文档-2.1-使用OpenUI5开发应用 UI5-文档-2.2-使用SAP Web IDE开发应用程序 UI5-文档-2.3-使用SAPUI ...

  3. 由于C++类库版本不同导致的OpenCV编译链接错误

    太长不看版:GCC4和GCC5使用的C++标准库下,string的名字不一样,导致链接错误. 之前在Ubuntu下使用OpenCV的时候一切正常.后来再次编译的时候,连接器提示有些库函数找不到: ma ...

  4. Delphi声明Record变量后直接初始化

    TARec = record    A1: string;    A2: string;  end; TBRec = record    A1: string;    A2: string;    A ...

  5. hbase orm中间层hbasedao

    博客园发布文章的体验太差,Markdown的支持巨烂无比,尝试了富文本编辑,太麻烦,遂作罢.想看的跳转到这两个连接吧 树莓派的奇幻漂流 github

  6. HTML5 画图--文字

    1:html <div style="margin:0 auto;width:794px;height:1123px"> <canvas id="myC ...

  7. centos7 /etc/profile /etc/bashrc

    在/etc/profile中添加环境变量后,是使用source /etc/profile编译后只能在当前终端生效 重新开启一个终端后,该环境变量失效. 解决方法: 重启系统:reboot,问题解决 环 ...

  8. Hibernate 序列生成主键

    @Entity @Table(name="TABLE_NAME") public class TableName implements Serializable { @Id @Ge ...

  9. 几种TCP连接终止

    在三次连接完成后,accept调用前,客户机发来RST. Berkeley实现将完全在内核中处理,不通知. 而SVR4实现将返回一个错误EPROTO,而POSIX指出应该是ECONNABORTED,后 ...

  10. app电池续航上&&下--Android自动化测试学习历程

    章节:自动化基础篇——电池续航自动化测试上&&下 主要讲解内容及笔记: 一.影响手机电量的因素和理论: 下面是一个表格:当今主流手机显示屏技术.机型与功耗对照表:   技术  类型   ...