tcp/ip协议族中传输层最重要的两种协议是UDP和TCP协议,上一篇文章用很短的篇幅介绍完了UDP协议相关的内容,但相对于UDP而言的TCP协议,是种更复杂,应用更广的协议。在接下来的几篇文章中都会学习TCP协议相关的知识。这里补充一点有用的小知识:之前分析网络包我都用的tcpdump命令,因为写博客时都在用ubuntu系统,所以linux下的tcpdump简单强大,也不用安装什么。现在写文章时换回了windows7系统,因为之前在ubuntu下写一篇文章时浏览器总是莫名的把写了半天的文章搞丢,所以换回windows写文章。在windows下分析网络包用的wireshark,一个你不得不知道的专业分析网络包的工具。
首先还是介绍下TCP协议的rfc定义文档内容。RFC793 定义了TCP协议。
首先我们要清楚TCP在整个TCP/IP协议族中的位置。它基于IP协议之上,服务于更高层的应用层协议,如ftp,http,smtp等等。
TCP的头部格式(Header Format)如下:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
(给大家介绍一个画ascii图的网址:http://www.asciiflow.com/#Draw)
TCP连接的建立,我想很多找工作的时候都喜欢问这个问题,比如说说TCP连接的三次握手(three way handshake)的过程。所以搞清楚tcp连接建立的过程至少对找工作还是挺有帮助的。
现在经过这三步(三次握手),已经建立起了一个tcp连接。这里要强调的上图中没有所谓的哪边是客户端,哪边是服务端,都只是相对而言的。
tcp的关闭有较连接建立有点复杂,因为我们知道tcp连接是全双工的,即端与端之前可以同时都可以发送,接收数据。那么关闭连接理论上是可以有多种组合的。
下面来看一种正常情况下的关闭流程:
还有一种情况,就是一端完成关闭通知后,它还可以接收别一端继续传输过来的数据直到别一端也通知连接在这个方向上也关闭了。这就是所谓的tcp连接半关闭。如图:
上图说明:实线箭头方向是客户端的正常状态变迁,虚线箭头是服务端的正常状态变迁,如果大家要上机实践下,可以用netstat命令查看本机的所有连接状态。结合wireshark截包分析下。
用序列图来表示整个连接建立和终止的过程中状态的变迁过程:
其实这两个图描述的tcp状态变迁过程一样,只是表现形式不同。可以从这两个图中明确的学习到tcp的状态变化。