TCP/IP之TCP的建立与终止
TCP协议简介
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)
- Source Port: 源端口。我们知道ip报文中有源ip地址和目的ip地址,这两个值加上tcp报文中的源端口(source port)和目的端口(destination port),就确定了一个tcp连接。
- Destination Port: 目的端口。如source port介绍一样。 一般对于一个ip地址和一个port端口号,我们也称为一个socket。说起socket我们应该并不陌生,在应用开发时经常用到。socket就是对网络编程接口的封装。
- Sequence Number: 序列号。我们知道tcp是面向流的连接。tcp针对每个传送的字节,都会进行计数。序号是32bit的无符号数。值范围是0~232-1,当达到最大值时会从又从0开始计数。
- Acknowledgment Number: 确认序号。指期望下次接收到的序列号。
- Data offset: TCP报文头部长度。以32位(8byte)为单位。所以最大报议长长度是60字节。如果没有可选字段的话,一般是20字节。
- Reserved: 保留字段
- U,A,P,R,S,F: 六个标志位。URG:紧急指针 ACK:确认序号有效 PSH:接收方应该尽快将该报文交给应用层 RST:重新连接 SYN:同步序号发起一个连接 FIN:发端完成发送任务
- window: TCP流量的窗口大小。以字节为单位。最大是216 - 1 = 65535
- Checksum: 检验和,覆盖了整个TCP的头部和数据。同发送端计算,接收端验证。
- Urgent Pointer: 紧急指针是一个正的偏移量,它和序号字段相加表示紧急数据的最后一个字节序号
- options: 可选字段。最常见的可选字段如MSS(maximum segment size)。
- Padding: 填充字段。因为头部字段必需是32位的整数倍。所以当可选字段非32整数倍长度时,用0来填充。
- data: tcp数据
TCP连接建立
TCP连接的建立,我想很多找工作的时候都喜欢问这个问题,比如说说TCP连接的三次握手(three way handshake)的过程。所以搞清楚tcp连接建立的过程至少对找工作还是挺有帮助的。
- client端发送一个syn初始化同步序列号,假设seq=0x9e0dd824, 我们这里用16进表示。上图中标示seq=0的表示方法是相对表示法,这样以后出现的seq序列号都是相对于syn时的初始序列号的数。
- server端收到客户端的syn报文后,同时也发送一个[syn,ack]的报文。注意这里的seq=0表示server端的初始化序列,也是一个相对值,它的真实值可能是seq=0x59bc0bd5。这时发送的报文中设置了ack标识,并置确认序列号(acknowledge number)为ack=1,即为之前收到的[syn]中seq的初始化值加1,真实值为ack=0x9e0dd825
- client发送一个[ack]报文。seq=1,即为seq=0x9e0dd825, ack=1指对server端上次发送的seq加1 ,即ack=0x59bc0bd6
现在经过这三步(三次握手),已经建立起了一个tcp连接。这里要强调的上图中没有所谓的哪边是客户端,哪边是服务端,都只是相对而言的。
TCP连接终止
tcp的关闭有较连接建立有点复杂,因为我们知道tcp连接是全双工的,即端与端之前可以同时都可以发送,接收数据。那么关闭连接理论上是可以有多种组合的。
下面来看一种正常情况下的关闭流程:
- clinet端主动发起关闭操作,发送一个[fin,ack]的报文。
- server端在收到client端发送的[fin,ack]报文后,也回复一个[fin,ack]报文
- client端最后发送一个[ack],此时连接终止过程就完成了。
还有一种情况,就是一端完成关闭通知后,它还可以接收别一端继续传输过来的数据直到别一端也通知连接在这个方向上也关闭了。这就是所谓的tcp连接半关闭。如图:
- client端发送[fin,ack]报文通知server端它已经结束在这个方向上的数据传输。
- server端发送[ack]确认
- 此时client-->server方向上已经不能再传输任何数据了。但是server-->client方向上还可以继续传输数据。
- 当server完成了这个方向上的数据传输时,它现在要关闭这个方向上的连接,则要发送[fin,ack]报文
- client最后一次发送[ack]确认
TCP状态变迁
上图说明:实线箭头方向是客户端的正常状态变迁,虚线箭头是服务端的正常状态变迁,如果大家要上机实践下,可以用netstat命令查看本机的所有连接状态。结合wireshark截包分析下。
用序列图来表示整个连接建立和终止的过程中状态的变迁过程:
其实这两个图描述的tcp状态变迁过程一样,只是表现形式不同。可以从这两个图中明确的学习到tcp的状态变化。
TCP/IP之TCP的建立与终止的更多相关文章
- TCP/IP、TCP、UDP、Socket知识汇总
带你了解TCP/IP,UDP,Socket之间关系 https://blog.csdn.net/chaoshenzhaoxichao/article/details/79785318 主要知识点: T ...
- TCP/IP协议--TCP协议概括和TCP连接的建立和终止
TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...
- TCP/IP 笔记 - TCP拥塞控制
拥塞控制是TCP通信的每一方需要执行的一系列行为,这些行为有特定算法规定,用于防止网络因为大规模的通信负载而瘫痪.其基本方法是当有理由认为网络即将进入拥塞状态(或已由于拥塞而出现路由丢包情况)时减缓T ...
- TCP/IP 笔记 - TCP连接管理
TCP是一种面向连接的单播协议,在发送数据之前,通信双方必须在彼此建立一条连接:这与UDP的无连接不同,UDP无需通信双方发送数据之前建立连接.所有TCP需要处理多种TCP状态时需要面对的问题,比如连 ...
- TCP/IP协议--TCP的交互数据流和成块数据流
前边讲了TCP连接的建立和终止,分别要三次握手和四次通信.这些报文段都只包含首部,没有数据部分. 这里就讲讲数据传送的一些细节.一个TCP连接建立成功以后,就可以开始传送数据了~ 一般TCP数据 ...
- <再看TCP/IP第一卷>TCP/IP协议族中的最压轴戏----TCP协议及细节
题外话:刚刚过去的半个月实在是忙得我喘不过来气,虽然手里还压着几个项目得在期末考试之前做完,但是想想还是更新一下随笔,稍微换个心情.另外小吐槽一下那些在博客园里原封不动抄书当随笔的人,唉真是....算 ...
- TCP/IP笔记——TCP特点、首部格式、滑动窗口
这次总结一下TCP相关的知识. TCP主要特点 面向连接:在通信前必须建立连接(只是逻辑上存在,而不是物理连接) 只能有两个端点:即只能一对一通信(所以通常p2p是用UDP实现的) 提供可靠交付服务: ...
- 【TCP/IP】TCP的三次握手和四次挥手
传输控制协议(TCP)是一种面向连接的协议,网络程序使用这个协议的时候,网络可以保证客户端和服务端的连接是可靠的,安全的. 如果 A机向 B机发送“hello”,在物理网线上传输的数据不仅仅是“hel ...
- 【TCP/IP】TCP详解笔记
目录 前言 17. TCP 传输控制协议 17.1 引言 17.2 TCP 服务 17.3 TCP的首部 18. TCP连接的建立与终止 18.1 引言 18.2 连接的建立与终止 18.2.1 建立 ...
随机推荐
- JAVA WEB 的JSP(9*9乘法表+*型金字塔)
运行环境及工具: (Tomcat7) + (JAVA JDK)+ (Eclipse for J2EE) 输出9*9乘法表 代码片段的练习 增加一些简单的JS功能 <%@ page import= ...
- [ZZ] KlayGE 游戏引擎 之 Order Independent Transparency(OIT)
转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2233 http://dogasshole.iteye.com/blog/1429665 ht ...
- Apache Spark源码走读之11 -- sql的解析与执行
欢迎转载,转载请注明出处,徽沪一郎. 概要 在即将发布的spark 1.0中有一个新增的功能,即对sql的支持,也就是说可以用sql来对数据进行查询,这对于DBA来说无疑是一大福音,因为以前的知识继续 ...
- js 创建书签小工具之理论
我们一直在寻找增加浏览体验的方法,有的方法众所周知,有的则鲜为人知.我原本认为书签小工具属于后者,非常令人讨厌的东西.令我非常懊恼的是我发现在这个问题上我完全是错误的.它并不是令人厌烦的,而是以用户为 ...
- 随机(Random)
随机(Random)随机是智能的基础,人工智能的很多技术都需要用到随机,因此有必要把这个提到前面谈谈一考虑基于C/C++,般我们都是使用的rand ()等函数实现随机,当然我们也有吊炸天的boost库 ...
- [源码]随机获取虾米音乐song_id API文件
[源码]随机获取虾米音乐song_id API文件 January 11, 2015 注意:此API请放置于国内主机使用,如香港.北京等等,否则会提示:虾米音乐在您所处的国家或地区暂时无法使用 < ...
- docker安装与启动
安装docker [root@localhost /]# yum -y install docker-io 更改配置文件 [root@localhost /]# vi /etc/sysconf ...
- the basic index concept
Computer Science An Overview _J. Glenn Brookshear _11th Edition Over the years numerous variations o ...
- android 设计工具栏
设计工具栏Action Bar(订制工具栏类型) 工具栏给用户提供了一种熟悉和可预测的方式来执行某种动作和操纵应用程序,但是这并不意味着它就需要和其他的应用程序看起来一样的.如果想设计工具栏以使得它能 ...
- 用c++builder读取一个一行有多行变量的文件
文件内容如下: C DXDY.INP FILE, IN FREE FORMAT ACROSS COLUMNS for 83658 Active CellsC 2013-5-25 上午 10:43 ...