HTTP协议(2)----->连接管理

 

1.  TCP连接

1.1  TCP为HTTP提供了一条可靠的比特传输管道

  TCP(Transmission Control Protocol)----传输控制协议,是主机对主机层的传输控制协议,提供可靠的连接服务。 TCP的数据是通过名为IP分组(或IP数据报)的小数据块来发送的。HTTP/HTTPS网络协议栈如下所示:

  1. HTTP收到一条报文时,报文数据内容转化为流的形式;
  2. 数据流通过一条打开的TCP连接按顺序传输;
  3. TCP收到数据流,将数据流砍成为被称作为段的小数据块;
  4. 小数据块封装的IP之中;
  5. 通过英特网完成传输;

  TCP段都是由IP分组承载(下图表示为TCP某段的参数),从一个IP地址发到另外一个IP地址。每一个IP分组中都包括:

  1. 一个IP分组首部(通常20字节)--->包含源和目的的IP地址、长度、其他的标记;
  2. 一个TCP段首部(通常20字节)--->包含TCP端口号、TCP控制标记、数据排序和完整性检查的数字值;
  3. 一个TCP数据块(0个或者多个字节)--->要传送的报文数据流;

TCP段#x

  TCP的连接通过四个值来识别:

<源IP地址 、 源端口号 、 目的IP地址 、 目的端口号>

  TCP分段传输示意如下:

1.2  TCP套接字编程

 

  伪代码说明通过套接字API,客户端和服务器实现HTTP事务时执行的步骤:

 

1.3  TCP三次握手四次挥手(划重点!!!)

 

  要知道!!! 什么是三次握手,为什么不是两次?什么是四次挥手?第二三次挥手为什么不合并呢?

  先说说TCP的标志位,有6种标示:

  1. SYN(synchronous建立联机)
  2. ACK(acknowledgement 确认)
  3. PSH(push传送)
  4. FIN(finish结束)
  5. RST(reset重置)
  6. URG(urgent紧急)

  三次握手,数据传输,四次挥手图:

  

  那为什么需要三次握手呢?基于上图所示,如下的过程:

  1. 客户端C向服务器S发起建立连接请求:C——>S;
  2. 客户端C收到服务器S的发送信号,并且向客户端C发送确认信息:S——>C;
  3. 客户端C收到服务器S的确认信号,并向S发送确认信号:C——>S。

  三次握手大概就是这么个过程:

  1. 通过第一次握手,服务器S知道客户端C能发送数据。
  2. 通过第二次握手,客户端C知道服务器S能收、能发送数据。
  3. 结合第三次握手,服务器S知道客户端C能够接收数据。

  至此,完成了握手过程,客户端C知道能服务器S能收能发,服务器S知道客户端C能收能发,通信连接至此建立。

  两个要点:(要知道!!!)

  1. 三次握手的完成,只是一个客户端C和服务器S是否能够相互建立连接的确认过程,还没有进行真正数据块儿的传输,数据块的传输是在三次握手完成之后的事情;
  2. 采用两次握手可能会出现失效情况,客户端发出的连接请求没有收到服务器的确认(没有第二次握手),于是经过一段时间后,客户端又重新向服务器发送新的连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,客户端第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到服务器,服务器以为是客户端又发起的新连接,于是服务器同意连接,并向客户端发回确认,但是此时客户端根本不会理会,服务器就一直在等待客户端发送数据,导致服务器的资源浪费。三次握手是保证可靠的最小握手次数,再多次握手也不能提高通信成功的概率,反而浪费资源。

  四次挥手,结合上图,请看如下过程:

  1. 客户端C向服务器S发起请求,表示客户端C没有数据要发送了:C——>S;
  2. 服务器S向客户端C发送信号,确认客户端C的断开请求:S——>C;
  3. 服务器S向客户端C发送信号,请求断开连接,表示服务器S没有数据要发送了:S——>C;
  4. 客户端C向服务器S发送确认信号,同意断开:C——>S。

  服务器S收到确认信号,断开连接,而客户端在一段时间内没收到服务器的信号,表明服务器S已经断开了,于是客户端C也断开了连接。至此,完成挥手过程。

  为什么需要四次挥手,第二第三次挥手能合并哇???

  当然不可以!挥手和握手相似,确认断开过程,但是,挥手要多一个确认数据的断开,不仅仅是确认连接的断开,所以要比握手多一次。握手---->连接的建立;挥手---->连接的断开+数据的断开(多一次)。

 

posted @ 2018-01-24 14:29  穿格子衫的孔乙彼  阅读(389)  评论(0编辑  收藏  举报