TCP

来源:互联网 发布:php chr函数 编辑:程序博客网 时间:2024/05/16 15:02

经常我们会提到TCP/IP协议,其实TCP/IP协议是包含很多协议的合集
就是TCP和IP一起协同工作,TCP负责应用软件和网络软件之间的通信,IP负责计算机之间的通信,网络上的两个终端都遵从同一个协议(比如TCP/IP),才能互相稳定的通信

TCP/IP的主要特点

  • TCP是面向连接的传输层协议,应用程序在使用TCP协议前,必须先建立TCP连接,在数据传输完毕后,必须释放已经建立的TCP连接。
  • TCP连接是点对点的,也就是一对一,和UDP不同的是,UDP可以一对多,多对多
  • TCP是可靠传输,通过TCP传输的数据,不丢失,不乱序,不出错
  • TCP是面向字节流的,不像UDP是面向报文的。TCP把应用层交付下来的数据看成一连串的无结构的字节流,TCP并不知道所传输的字节流的含义。

    那么TCP是怎么做到可靠传输的呢?这其中需要几个机制来保证数据的可靠传输

1.确认机制ACK:接收方显示的告诉发送方分组已经正确接收
2.重传机制
3.校验和:检测位错误
4.序列号:发送方给每个分组增加序列号,解决接收方收到重复分组的问题
5.停等策略:发送方等待“合理”时间,如果没有收到ACK就会重传

停等是一个很浪费时间的事情,所以为了提高资源利用率,引入了流水线机制和窗口滑动协议。

流水线机制允许用户在收到ACK之前连续发送多个分组,那么序列号的范围就要扩大,同时发送方和接收方需要更大的存储空间以缓存分组。

窗口滑动协议(Sliding-Window protocol)顾名思义,随着协议的运行,窗口在序列号空间内向前滑动,窗口尺寸N代表最多有N个等待确认的消息,窗口滑动协议主要有GBN和SR

TCP连接

三次握手和四次挥手
TCP连接过程中解决以下三个问题:

1. 要使每一方能够确认对方的存在;
2. 要允许双方协商一些参数,比如最大窗口值,时间戳选项等;
3. 能够对运输实体资源进行分配。

建立连接
这个过程称为三次握手,南那么为什么要是三次握手,而不是两次握手,一次握手呢?这是为了防止已经失效的连接请求突然又传给了服务端,举例来说吧

比如A要和B建立连接,正常情况下,A发出请求,但是由于丢失没有收到确认,于是A又重传了一次连接请求,然后确认,建立连接数据传输完毕后,释放连接。A一共发送了两个连接报文其中第一个丢失,第二个丢失,没有出现已经失效的连接请求报文段

再来考虑异常情况,如果A发送的连接请求没有丢失而是延时到达B,那么B会以为这是A的又一次握手,于是连接再次简称,然而A并没有数据传输需求,这样B的资源就别白白浪费了。

第一步,客户端发送TCP SYN给客户端,SYN为1,不传输数据
第二步,服务端接收到SYN后,给客户端返回一个SYNACK
第三步,客户端接收到SYNACK后,发送ACK给服务端,可能会传输数据

图解如下:

这里写图片描述

关闭连接

第一步,客户端给服务端发送TCP FIN(多数情况下是客户端发起请求,服务端也可以发起请求)
第二步,服务端收到FIN后,回复ACK,关闭连接,给客户端发送FIN
第三步,客户端收到FIN,回复ACK

为了确保服务端能够正确的关闭并且释放资源,客户端会进入等待阶段,一般建议等待时间设置为2分钟,如果在等待阶段中重复收到FIN,会重新发送ACK

第四步,服务端收到ACK,关闭连接

图解如下:

这里写图片描述

下图表示了一个完整的过程:

这里写图片描述

原创粉丝点击