加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

TCP协议详解

(2017-11-15 11:48:41)
标签:

网络

分类: Linux

TCP协议是传输层上重要的一个协议,所以下面我就对TCP协议总结一下。

一、TCP服务特点

(1)面向连接的。面向连接就是通讯双方必须先建立连接,才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。

(2)可靠的。可靠性体现在TCP协议提供了超时重传机制和发送应答机制。

(3)流式服务。当接收端收到一个或多个TCP报文段后,TCP模板将它们携带的应用程序数据按照TCP报文段的序号依次放入TCP接收缓冲区中,并通知应用程序读取数据。应用程序的读取操作数量和接收数据操作数量没有固定的数量关系。(后面会说的UDP的数据报服务,一次读操作就有一次接收操作,一对一)

二、TCP头部结构

http://s5/mw690/006euGCHzy7fP0TdhHu14&690

 

 16位源端口号和16位目的端口号:告知主机该报文段来自哪里(源端口)以及传给哪个上层协议或者应用程序(目的端口)。


32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每一个字节编号。因为有32位序号的存在,保证了收到的数据不会乱序。(可靠保障)


32位确认号:用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。(可靠保障)


4位头部长度:标识改TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最长是60字节。


6位标志位包含以下几项:

  URG标志:表示紧急指针是否有效。

  ACK标志:表示确认号是否有效。称ACK标志的TCP报文段为确认报文段。

  PSH标志:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为后续数据腾出空间。

  RST标志:表示要求对方重新建立连接

  SYN标志:表示请求建立一个连接。

  FIN标志:表示通知对方本端要关闭连接了。


16位窗口大小:是TCP流量控制的一个手段。告诉对方本段TCP接收缓冲区还能容纳多少字节的数据,对方就可以控制发送数据的速度。


16位校验和:由发送端填充,接收端对TCP报文执行CRC算法检验TCP报文段在传输过程中是否损坏。(可靠保障)


16位紧急指针:一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。

  

TCP头部选项:是一个可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中20字节为固定部分)。

三、TCP连接的建立和关闭

 http://s1/mw690/006euGCHzy7fP0Xn4ME10&690

连接建立:三次握手

理解:因为TCP协议是面向连接的,所以两个应用程序通信之前要先建立连接。三次握手就是一个建立连接的过程。

过程比喻:

 A:我现在想和你通信了,你能收到我发的这条消息吗?(SYN

 B:我确认收到你的消息了(ACK),那你现在能收到我的这条消息吗?(SYN

 A:我确认收到你的这条消息了(ACK

到了这一步则三次握手已经完成,表示两个应用程序已建立连接。这里应该指如果我能收到你的上条消息则就能收到你发给我的消息,所以经过三次通信后就能建立连接。(之前想过如果我后面发的消息你没收到怎么办,那就需要每次一个人发一个消息,另一个人说我收到了消息,你收到我现在发的消息没,其实这是一个无限循环的过程,而且什么事也没有干。)

注:建立连接至少是3次握手,不能少。

断开连接:四次挥手

 http://s9/mw690/006euGCHzy7fP0ZahrGb8&690

 

 

过程比喻:4次挥手

 A:我现在想断开连接了(FIN)(既然想断开连接了,那肯定已经建立了连接)

 B:我确认收到你的消息了(ACK)(但是现在我还有一些数据要处理,还不能马上断开连接)

 B:好了,我现在处理好了,可以断开连接了(FIN

 A端:我确认收到你的断开请求了(ACK

 

这里提出一个概念:半关闭状态

简单来说就是通信的一端发送结束报文段(FIN)给对方,告诉它本端已经完成了数据的发送,但允许继续接收来自对方的数据,直到对方也发送了结束报文段以关闭连接。如上说就是A端发起的FIN时到B端发起FIN直间这个状态,期间A端可以继续接收来自B端的数据。

 

注:

4次挥手也可以是3次挥手(B端接收到断开请求时不用处理数据,直接也可以发出断开请求)

A:我现在想断开连接了(FIN)(既然想断开连接了,那肯定已经建立了连接)

  B:我确认收到你的消息了(ACK) 我可以断开连接了(FIN

  A端:我确认收到你的断开请求了(ACK

 

下面我们来详细看一下从连接到断开的状态转化图

 http://s16/mw690/006euGCHzy7fP12aoI7ff&690

这里需要注意的是:

(1)断开连接是服务器端和客户端都可以主动提出断开请求,谁提出的TIME_WAIT就在那一边。(即主动发起断开链接请求的一端)

TIME_WAIT意义:

1、保证可靠的终止 TCP 连接

2、保证迟来的数据报能被识别并丢弃

 

 http://s11/bmiddle/006euGCHzy7fP13LDdMca&690

由这幅图可以明确看出三次握手建立连接,四次挥手断开连接的过程,可以看出确认报文段(ACK)的值是收到的TCP报文段的序号值加1

 

附上一张TCP状态转移图

 http://s6/bmiddle/006euGCHzy7fP15fIGN05&690

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有