一、前言:

 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. Java LinkList遍历方式

    1.LinkedList的遍历方式 a.一般的for循环(随机访问) int size = list.size(); for (int i=0; i<size; i++) { list.get( ...

  2. Spring在代码中获取properties文件属性

    这里介绍两种在代码中获取properties文件属性的方法. 使用@Value注解获取properties文件属性: 1.因为在下面要用到Spring的<util />配置,所以,首先要在 ...

  3. Hibernate hql 多表查询

    String hql="select c from Col c ,UserRole role where c.id=role.columnId and c.id=? and role.use ...

  4. adb连接过程中常见问题解决方法

    在测试过程中经常会遇到需要使用adb连接服务器的问题,但是有时候经常会遇到连不上的情况,总结两种解决方式 1)error: unknown host service 此问题是由于端口号已经被占用了,可 ...

  5. invalid self-signed ssl certificate

    down voteaccepted Cheap and insecure answer: Add process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0& ...

  6. frm和ibd恢复sql文件的操作

    情况:有mysql中data文件(仅仅一个数据库) 操作:frm和ibd恢复sql文件的操作 1.创建相同名字的库xxx 2.把ibdata1替换成原来的 3.把数据库xxx内内容全部替换为原来的 完 ...

  7. 求2的n次方对1e9+7的模,n大约为10的100000次方(费马小定理)

    昨天做了一个题,简化题意后就是求2的n次方对1e9+7的模,其中1<=n<=10100000.这个就算用快速幂加大数也会超时,查了之后才知道这类题是对费马小定理的考察. 费马小定理:假如p ...

  8. [SCOI2007]修车(建图好题)

    [SCOI2007]修车 https://www.lydsy.com/JudgeOnline/problem.php?id=1070 Time Limit: 1 Sec  Memory Limit:  ...

  9. 如何转换pdf文档为word文档--先标记下,本周把这个问题知识掌握

    http://developer.51cto.com/art/201803/567539.htm

  10. RedisUtil工具类

    转载:http://blog.csdn.net/liuxiao723846/article/details/50401406 1.使用了jedis客户端,对redis进行了封装,包括: 1)使用了re ...