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 建立 ...
随机推荐
- 使用Eclipse开发Java Web过程中Debug调试的使用方法
里介绍的是在Eclipse中的Debug调试. 首先右击项目选择Debug As -- Debug on Server 或者点击Server面板的小昆虫图标,启动Debug模式. 运行web项目,进行 ...
- 《Java核心技术卷一》笔记 多线程
有时,我们需要在一个程序中同时并行的处理多个任务,如播放器一边要播放音乐同时还要不断更新画面显示,或者是一边执行耗时任务,UI还能一边继续响应各种事件.还有的时候,一个任务需要很长时间才能完成,如果分 ...
- markdown 书写表格
Tables Are Cool col 3 is right-aligned $1600 col 2 is centered $12 zebra stripes are neat $1 Refs ma ...
- javaWeb中servlet开发(1)——helloworld
1.servlet 1.1 servlet简介 1.2 servlet流程 不管是servlet还是jsp,所有的程序都是在服务器端处理的,所以必须了解一个servlet基本流程 servlet和JS ...
- Java:按值传递还是按引用传递详细解说
前天在做系统的时候被Java中参数传递问题卡了一下,回头查阅了相关的资料,对参数传递问题有了新的了解和掌握,但是有个问题感觉还是很模糊,就是Java中到底是否只存在值传递,因为在查阅资料时,经常看到有 ...
- 使用AJAX做关键字查询:输入框变化自动搜索、无刷新页面;
使用AJAX做关键字查询要求:1.无刷新页面2.输入框变化自动搜索 <style type="text/css"> .k{ width:150px; height:30 ...
- C/C++预处理和编译
预处理器的作用 当我们对源代码进行编译时,第一个阶段就是进行预处理.以#开头的都是预处理指令,都会被预处理器处理掉. 也就是说:我们写的代码,不是直接被编译,而是先被预处理器进行修改.那么预处理器如何 ...
- php--.prop()
.prop() 获取匹配的元素集中第一个元素的属性(property)值或设置每一个匹配元素的一个或多个属性. .prop()方法只获得第一个匹配元素的属性值 .如果元素上没有该属性,或者如果没有匹配 ...
- Maven实战(七)settings.xml相关配置
一.简介 settings.xml对于maven来说相当于全局性的配置,用于所有的项目,当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们 ...
- 20145211《Java程序设计》第5周学习总结——独上高楼,望尽天涯路
教材学习内容总结 异常处理 JAVA异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.异常就是出现在运行时出现不正常 ...