标签:
1.TCP头部结构
TCP头部结构如下图所示,其中的诸多字段为管理TCP连接和控制数据流提供了足够的信息。
16位端口号:告诉主机该报文段是来自哪里以及传给哪个上层的协议或应用程序(目的端口)的。
32位序号:一次TCP通信过程中某个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。
32位确认号:用作对另一方发送来的TCP报文段的相应。其值是收到的TCP报文段值加一。
4位头部长度:标识该TCP头部有多少个32bit。
16位窗口大小:是TCP流量控制的一个手段。告诉对方本端的TCP接受缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
2.TCP连接的建立和关闭
用tcpdump抓取TCP三次握手与四次挥手的报文如下:
图示如下:
TCP连接是全双工的,所以它允许两个方向的数据传输被独立关闭。也就是说,通信一方可以发送结束报文段给对方,告诉它本端已经完成了数据的发送,但允许继续接受来自对方的数据,直到对方也发送结束报文以关闭连接,TCP称这种状态为半关闭状态,如下图所示:
socket网络编程接口shutdown函数提供了对半关闭的支持。当调用close()函数时,表示读写同时关闭,这时两端同时关闭socket连接。当调用shutdown时,可以指定只关闭写,此时进入到半关闭状态。
3.TCP状态转移
主动关闭TCP连接的一方在接收对方的结束报文段后,并没有直接进入到CLOSED状态,而是转移到TIME_WAIT状态。这个状态,一般持续2MSL(Maximum Segment Life,报文段最大生存时间)的时间,才能完全关闭。这么做主要是保证对方能收到对结束报文段的ACK,确保网络能可靠的终止。我们可以通过socket选项SO_REUSEADDR来强制进程立即使用处于TIME_WAIT状态的连接占用的端口。
4.复位报文段
有三种情况会使TCP连接的一端向另一端发送携带RST标志的报文段。
(1)访问不存在的端口
当客户端程序访问一个不存在的端口时,目标主机将给它发送一个复位报文段。
(2)异常终止连接
TCP提供了一个异常终止连接的方式,即给对方发送一个复位报文段。一旦发送了复位报文段,发送端所有排队等待发送的数据都将被丢弃。
(3)处理半打开连接
TCP的一端关闭或异常终止了连接,而对方没有收到结束报文,此时另一端还维持着原来的链接。我们称此时的状态为半打开状态。如果此时往处于半打开状态的连接写入数据,则对方会回应一个复位报文段。
5.TCP超时重传
TCP为每个TCP报文都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到对方的应答,TCP模块将重传TCP报文段并重置定时器。一般超时一次,TCP定时器的时间会翻一倍。最多重传的次数由内核的参数给出。
标签:
原文地址:http://blog.csdn.net/yao_wust/article/details/45556117