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连接建立的过程至少对找工作还是挺有帮助的。

  1. client端发送一个syn初始化同步序列号,假设seq=0x9e0dd824, 我们这里用16进表示。上图中标示seq=0的表示方法是相对表示法,这样以后出现的seq序列号都是相对于syn时的初始序列号的数。
  2. server端收到客户端的syn报文后,同时也发送一个[syn,ack]的报文。注意这里的seq=0表示server端的初始化序列,也是一个相对值,它的真实值可能是seq=0x59bc0bd5。这时发送的报文中设置了ack标识,并置确认序列号(acknowledge number)为ack=1,即为之前收到的[syn]中seq的初始化值加1,真实值为ack=0x9e0dd825
  3. client发送一个[ack]报文。seq=1,即为seq=0x9e0dd825, ack=1指对server端上次发送的seq加1 ,即ack=0x59bc0bd6

现在经过这三步(三次握手),已经建立起了一个tcp连接。这里要强调的上图中没有所谓的哪边是客户端,哪边是服务端,都只是相对而言的。

TCP连接终止

tcp的关闭有较连接建立有点复杂,因为我们知道tcp连接是全双工的,即端与端之前可以同时都可以发送,接收数据。那么关闭连接理论上是可以有多种组合的。

下面来看一种正常情况下的关闭流程:

  1. clinet端主动发起关闭操作,发送一个[fin,ack]的报文。
  2. server端在收到client端发送的[fin,ack]报文后,也回复一个[fin,ack]报文
  3. client端最后发送一个[ack],此时连接终止过程就完成了。

还有一种情况,就是一端完成关闭通知后,它还可以接收别一端继续传输过来的数据直到别一端也通知连接在这个方向上也关闭了。这就是所谓的tcp连接半关闭。如图:

  1. client端发送[fin,ack]报文通知server端它已经结束在这个方向上的数据传输。
  2. server端发送[ack]确认
  3. 此时client-->server方向上已经不能再传输任何数据了。但是server-->client方向上还可以继续传输数据。
  4. 当server完成了这个方向上的数据传输时,它现在要关闭这个方向上的连接,则要发送[fin,ack]报文
  5. client最后一次发送[ack]确认

TCP状态变迁

上图说明:实线箭头方向是客户端的正常状态变迁,虚线箭头是服务端的正常状态变迁,如果大家要上机实践下,可以用netstat命令查看本机的所有连接状态。结合wireshark截包分析下。

用序列图来表示整个连接建立和终止的过程中状态的变迁过程:

其实这两个图描述的tcp状态变迁过程一样,只是表现形式不同。可以从这两个图中明确的学习到tcp的状态变化。

TCP/IP之TCP的建立与终止的更多相关文章

  1. TCP/IP、TCP、UDP、Socket知识汇总

    带你了解TCP/IP,UDP,Socket之间关系 https://blog.csdn.net/chaoshenzhaoxichao/article/details/79785318 主要知识点: T ...

  2. TCP/IP协议--TCP协议概括和TCP连接的建立和终止

    TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...

  3. TCP/IP 笔记 - TCP拥塞控制

    拥塞控制是TCP通信的每一方需要执行的一系列行为,这些行为有特定算法规定,用于防止网络因为大规模的通信负载而瘫痪.其基本方法是当有理由认为网络即将进入拥塞状态(或已由于拥塞而出现路由丢包情况)时减缓T ...

  4. TCP/IP 笔记 - TCP连接管理

    TCP是一种面向连接的单播协议,在发送数据之前,通信双方必须在彼此建立一条连接:这与UDP的无连接不同,UDP无需通信双方发送数据之前建立连接.所有TCP需要处理多种TCP状态时需要面对的问题,比如连 ...

  5. TCP/IP协议--TCP的交互数据流和成块数据流

    前边讲了TCP连接的建立和终止,分别要三次握手和四次通信.这些报文段都只包含首部,没有数据部分.    这里就讲讲数据传送的一些细节.一个TCP连接建立成功以后,就可以开始传送数据了~ 一般TCP数据 ...

  6. <再看TCP/IP第一卷>TCP/IP协议族中的最压轴戏----TCP协议及细节

    题外话:刚刚过去的半个月实在是忙得我喘不过来气,虽然手里还压着几个项目得在期末考试之前做完,但是想想还是更新一下随笔,稍微换个心情.另外小吐槽一下那些在博客园里原封不动抄书当随笔的人,唉真是....算 ...

  7. TCP/IP笔记——TCP特点、首部格式、滑动窗口

    这次总结一下TCP相关的知识. TCP主要特点 面向连接:在通信前必须建立连接(只是逻辑上存在,而不是物理连接) 只能有两个端点:即只能一对一通信(所以通常p2p是用UDP实现的) 提供可靠交付服务: ...

  8. 【TCP/IP】TCP的三次握手和四次挥手

    传输控制协议(TCP)是一种面向连接的协议,网络程序使用这个协议的时候,网络可以保证客户端和服务端的连接是可靠的,安全的. 如果 A机向 B机发送“hello”,在物理网线上传输的数据不仅仅是“hel ...

  9. 【TCP/IP】TCP详解笔记

    目录 前言 17. TCP 传输控制协议 17.1 引言 17.2 TCP 服务 17.3 TCP的首部 18. TCP连接的建立与终止 18.1 引言 18.2 连接的建立与终止 18.2.1 建立 ...

随机推荐

  1. ueditor1.4.3 php版本使用修改图片上传路径

    实例化编辑器必须带上一下东西 header部分 <script type="text/javascript" charset="utf-8" src=&q ...

  2. [ZZ] 基于DirectX shader的Per-pixel lighting实现

    这个特效需要用到DX11 UAV吗? http://blog.tianya.cn/blogger/post_show.asp?BlogID=510979&PostID=5665974 Intr ...

  3. 【Spec for GS5】不要嘲笑程序员不懂烂漫

    // // main.cpp // 生日快乐 // // Created by wasdns on 16/11/21. // Copyright © 2016年 wasdns. All rights ...

  4. WEB系统开发

    最近根据项目组需求做了web工作流程系统,就是一个简单的web管理系统,取代原先使用的excel表格,在VS2008下面开发,数据库使用Mysql,使用Mysql-connecte 5.0与数据库连接 ...

  5. Xamarin学习资源收集

    推荐入门视频 跨行動平台App開發概觀- 使用Xamarin+Visual Studio https://www.youtube.com/watch?v=ELuFTTn1gS4 中文产品介绍http: ...

  6. PHP学习(五)----jQuery和JSON数据

    对于jQuery: jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程.

  7. 关于C和C++动态链接库的几个问题

    问题: 1.写一段C++程序,编译成动态链接库后,C程序怎么访问? 2.写一段C程序,编译成动态链接库后,C++程序怎么访问? 3.写一个类,编译成动态链接库后,里面的public变量能否访问? 对于 ...

  8. 【转】UGUI实现unity摇杆

    http://blog.csdn.net/onafioo/article/details/46403801 http://www.winig.cc/archives/348 好久没有写文章了,最近在做 ...

  9. XML xsd

    targetNamespace:表示本XSD中定义的元素和类型的名字空间都是http://exammpleOrder. xmlns:xsd:表示以前缀xsd开头的元素或则类型来自于http://www ...

  10. phaser

    phaser http://www.csdn.net/article/2015-10-08/2825865 https://github.com/gavinanderegg/coffeeQuest