一、前言:

 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. 双机\RAC\Dataguard的区别

    Oracle 双机/RAC/Dataguard的区别 Data Guard 是Oracle的远程复制技术,它有物理和逻辑之分,但是总的来说,它需要在异地有一套独立的系统,这是两套硬件配置可以不同的系统 ...

  2. 【343】MathJax、LaTex、Mathml 数学公式

    参考:cnblog中添加数学公式支持 分类参考: 1. 基本功能 MathJax 我的LaTeX入门 MathJax basic tutorial and quick reference 分段函数:矩 ...

  3. SQL事务日志备份时的问题

    1.在进行事务日志备份的时候,如下图: 3041 消息的疑难解答时的考虑事项:不会只是一个数据库或所有数据库出现问题吗?是备份到本地存储区或远程存储吗?哪种类型的备份 (数据库备份. 日志备份和差异备 ...

  4. 树莓派 Zero W+温度传感器DS18B20

    树莓派 Zero W+温度传感器DS18B20 作者:陈拓chentuo@ms.xab.ac.cn 2018.05.28/2018.06.01 0.  概述 用树莓派 Zero W读取DS18B20温 ...

  5. Hadoop 集群的一些问题

    1.创建用户hadoop adduser hadoop passwd hadoop usermod -a -G hadoop hadoop chown -R hadoop:hadoop  /data ...

  6. 查看webdriver针对浏览器的一些函数

    在用webdriver对浏览器进行操作时,很多操作并不是那么好找,后来在朋友的推荐下可以用下面的方法来寻找针对浏览器的一些操作,函数或属性等,这样方便我们可以查找一些方法去完成我们要的操作. 下面是查 ...

  7. Android中注解的使用

    如果你是一名安卓开发者,你也一定听过大名鼎鼎的网络请求框架Retrofit.它将网络请求的方式以注解的形式展现,极大的提高了代码的可读性,同时网络请求集中写在一个interface中提高了代码的可维护 ...

  8. DP解LCS问题模板及其优化

    LCS--Longest Common Subsequence,即最长公共子序列,一般使用DP来解. 常规方法: dp[i][j]表示字符串s1前i个字符组成的字符串与s2前j个字符组成的字符串的LC ...

  9. hibernate对数据库查询的坑

    hibernate对数据库的查询其实有很多种方法,下面我来介绍我知道的两种方法,以及它们可能会遇到的问题,这里前两种都是查询所有结果 最后一种是 使用hibernate查询一条记录. 第一种方法 pu ...

  10. 网络基础相关的知识 socket模块

    1.架构 1.C/S架构:client客户端和server服务器端 优势:能充分发挥pc机的性能 2.B/S架构:browser浏览器和server服务器    隶属于C/S架构 B/S架构  统一了 ...