TCP协议详解
标签:
网络 |
分类: Linux |
TCP协议是传输层上重要的一个协议,所以下面我就对TCP协议总结一下。
一、TCP服务特点:
(1)面向连接的。面向连接就是通讯双方必须先建立连接,才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。
(2)可靠的。可靠性体现在TCP协议提供了超时重传机制和发送应答机制。
(3)流式服务。当接收端收到一个或多个TCP报文段后,TCP模板将它们携带的应用程序数据按照TCP报文段的序号依次放入TCP接收缓冲区中,并通知应用程序读取数据。应用程序的读取操作数量和接收数据操作数量没有固定的数量关系。(后面会说的UDP的数据报服务,一次读操作就有一次接收操作,一对一)
二、TCP头部结构
http://s5/mw690/006euGCHzy7fP0TdhHu14&690
32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每一个字节编号。因为有32位序号的存在,保证了收到的数据不会乱序。(可靠保障)
32位确认号:用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。(可靠保障)
4位头部长度:标识改TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最长是60字节。
6位标志位包含以下几项:
16位窗口大小:是TCP流量控制的一个手段。告诉对方本段TCP接收缓冲区还能容纳多少字节的数据,对方就可以控制发送数据的速度。
16位校验和:由发送端填充,接收端对TCP报文执行CRC算法检验TCP报文段在传输过程中是否损坏。(可靠保障)
16位紧急指针:一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。
TCP头部选项:是一个可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中20字节为固定部分)。
三、TCP连接的建立和关闭
连接建立:三次握手
理解:因为TCP协议是面向连接的,所以两个应用程序通信之前要先建立连接。三次握手就是一个建立连接的过程。
过程比喻:
到了这一步则三次握手已经完成,表示两个应用程序已建立连接。这里应该指如果我能收到你的上条消息则就能收到你发给我的消息,所以经过三次通信后就能建立连接。(之前想过如果我后面发的消息你没收到怎么办,那就需要每次一个人发一个消息,另一个人说我收到了消息,你收到我现在发的消息没,其实这是一个无限循环的过程,而且什么事也没有干。)
注:建立连接至少是3次握手,不能少。
断开连接:四次挥手
过程比喻:4次挥手
这里提出一个概念:半关闭状态
简单来说就是通信的一端发送结束报文段(FIN)给对方,告诉它本端已经完成了数据的发送,但允许继续接收来自对方的数据,直到对方也发送了结束报文段以关闭连接。如上说就是A端发起的FIN时到B端发起FIN直间这个状态,期间A端可以继续接收来自B端的数据。
注:
4次挥手也可以是3次挥手(B端接收到断开请求时不用处理数据,直接也可以发出断开请求)
A端:我现在想断开连接了(FIN)(既然想断开连接了,那肯定已经建立了连接)
下面我们来详细看一下从连接到断开的状态转化图
这里需要注意的是:
(1)断开连接是服务器端和客户端都可以主动提出断开请求,谁提出的TIME_WAIT就在那一边。(即主动发起断开链接请求的一端)
TIME_WAIT意义:
1、保证可靠的终止 TCP 连接
2、保证迟来的数据报能被识别并丢弃
由这幅图可以明确看出三次握手建立连接,四次挥手断开连接的过程,可以看出确认报文段(ACK)的值是收到的TCP报文段的序号值加1。
附上一张TCP状态转移图

加载中…