图解TCP-IP协议

本文通过两个图来梳理TCP-IP协议相关知识。TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道。如图1所示,给出了TCP通信过程的示意图。

图1 TCP 三次握手四次挥手

图1主要包括三部分:建立连接、传输数据、断开连接。

1)建立TCP连接很简单,通过三次握手便可建立连接。

2)建立好连接后,开始传输数据。TCP数据传输牵涉到的概念很多:超时重传、快速重传、流量控制、拥塞控制等等。

3)断开连接的过程也很简单,通过四次握手完成断开连接的过程。

三次握手建立连接:


第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;


第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

传输数据过程:

a.超时重传

超时重传机制用来保证TCP传输的可靠性。每次发送数据包时,发送的数据报都有seq号,接收端收到数据后,会回复ack进行确认,表示某一seq号数据已经收到。发送方在发送了某个seq包后,等待一段时间,如果没有收到对应的ack回复,就会认为报文丢失,会重传这个数据包。

b.快速重传

接受数据一方发现有数据包丢掉了。就会发送ack报文告诉发送端重传丢失的报文。如果发送端连续收到标号相同的ack包,则会触发客户端的快速重传。比较超时重传和快速重传,可以发现超时重传是发送端在傻等超时,然后触发重传;而快速重传则是接收端主动告诉发送端数据没收到,然后触发发送端重传。

c.流量控制

这里主要说TCP滑动窗流量控制。TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。 滑动窗可以是提高TCP传输效率的一种机制。

d.拥塞控制

滑动窗用来做流量控制。流量控制只关注发送端和接受端自身的状况,而没有考虑整个网络的通信情况。拥塞控制,则是基于整个网络来考虑的。考虑一下这样的场景:某一时刻网络上的延时突然增加,那么,TCP对这个事做出的应对只有重传数据,但是,重传会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,于是,这个情况就会进入恶性循环被不断地放大。试想一下,如果一个网络内有成千上万的TCP连接都这么行事,那么马上就会形成“网络风暴”,TCP这个协议就会拖垮整个网络。为此,TCP引入了拥塞控制策略。拥塞策略算法主要包括:慢启动,拥塞避免,拥塞发生,快速恢复。

四次握手断开连接:

第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但此时主动关闭方还可以接受数据。

第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。

第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。

第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

图2给出了TCP通信过程中的状态转移图,理解此图是我们理解TCP-IP协议的关键。

图2 TCP状态转移图

状态图详细解读:


1.CLOSED:起始点,在超时或者连接关闭时候进入此状态。

2.LISTEN:服务端在等待连接过来时候的状态,服务端为此要调用socket,bind,listen函数,就能进入此状态。此称为应用程序被动打开(等待客户端来连接)。

3.SYN_SENT:客户端发起连接,发送SYN给服务器端。如果服务器端不能连接,则直接进入CLOSED状态。

4.SYN_RCVD:跟3对应,服务器端接受客户端的SYN请求,服务器端由LISTEN状态进入SYN_RCVD状态。同时服务器端要回应一个ACK,同时发送一个SYN给客户端;另外一种情况,客户端在发起SYN的同时接收到服务器端得SYN请求,客户端就会由SYN_SENT到SYN_RCVD状态。

5.ESTABLISHED:服务器端和客户端在完成3次握手进入状态,说明已经可以开始传输数据了。

以上是建立连接时服务器端和客户端产生的状态转移说明。相对来说比较简单明了,如果你对三次握手比较熟悉,建立连接时的状态转移还是很容易理解。

下面,我们来看看连接关闭时候的状态转移说明,关闭需要进行4次双方的交互,还包括要处理一些善后工作(TIME_WAIT状态),注意,这里主动关闭的一方或被动关闭的一方不是指特指服务器端或者客户端,是相对于谁先发起关闭请求来说的:

6.FIN_WAIT_1:主动关闭的一方,由状态5进入此状态。具体的动作是发送FIN给对方。

7.FIN_WAIT_2:主动关闭的一方,接收到对方的FIN-ACK(即fin包的回应包),进入此状态。

8.CLOSE_WAIT:接收到FIN以后,被动关闭的一方进入此状态。具体动作是接收到FIN,同时发送ACK。(之所以叫close_wait可以理解为被动关闭方此时正在等待上层应用发出关闭连接指令)

9.LAST_ACK:被动关闭的一方,发起关闭请求,由状态8进入此状态。具体动作是发送FIN给对方,同时在接收到ACK时进入CLOSED状态。

10.CLOSING:两边同时发起关闭请求时,会由FIN_WAIT_1进入此状态。具体动作是接收到FIN请求,同时响应一个ACK。

11.TIME_WAIT:最纠结的状态来了。从状态图上可以看出,有3个状态可以转化成它,我们一一来分析:

时间: 2024-10-02 21:14:06

图解TCP-IP协议的相关文章

从零构建TCP/IP协议

从零构建TCP/IP协议(这次叫PCT协议) 这篇博客是读完<图解TCP/IP协议>和<TCP/IP协议详解卷一:协议>之后的总结 我从0构建了一个可靠的双工的有序的基于流的协议,叫做PCT协议 :) OSI七层模型和TCP/IP四层模型 谈到计算机网络,就一定会说起OSI七层模型和TCP/IP四层模型,不过我们先从为何分层 说起. 为什么要分层 软件开发的过程中,我们经常听到的词语是"解耦","高内聚,低耦合"等等诸如此类的 词语,又常听见

透视你的网络 完美测试TCP/IP协议简介

安装网络硬件和网络协议之后,我们一般要进行TCP/IP协议的测试工作,那么怎样测试才算是比较全面的测试呢?我们认为,全面的测试应包括局域网和互联网两个方面,因此应从局域网和互联网两个方面测试,以下是我们在实际工作中利用命令行测试TCP/IP配置的步骤: 1. 单击"开始"/"运行",输入CMD按回车,打开命令提示符窗口. 2. 首先检查IP地址.子网掩码.默认网关.DNS服务器地址是否正确,输入命令ipconfig /all,按回车.此时显示了你的网络配置,观查是否

通过配置TCP/IP协议的方式使用DNS

本文描述了如何在Windows XP中通过配置TCP/IP协议的方式使用域名服务(DNS). DNS是一种用以将域名转换为IP地址的Internet服务.在Internet上,当您在网络操作过程中使用域名时,DNS服务负责将该域名转换为对应的IP地址.举例来说,域名www.reskit.com可能被转换为IP地址178.145.135.6. 在企业网络环境中,你可以对Windows XP进行适当配置,以便使其自动检测域控制器所使用的IP地址.此外,您也可以手工配置域控制器IP地址.下面将具体描述

[SQL]对于“无法用TCP/IP协议和远端SQL Server数据库连接”问题

server|数据|数据库|数据库连接|问题 对于"无法用TCP/IP协议和远端SQL Server数据库连接"问题 首先,需要确定您的SQL Server版本,以及它安装了哪些补丁,这很重要.如果补丁没有安装或者没有安装最新的ServicePack,请先安装. 然后,你可以试试看telnet SqlServerName 1433,看是否可以连接上.1433是SQl Server用TCP/IP协议的默认端口.你如果连这个端口都无法连接上,那就应该查查网络配置了. 第3,您得到的错误描述

XP系统下如何安装TCP/IP协议?

  XP系统下如何安装TCP/IP协议? 方法一 单击"开始"菜单,弹出的列表单击"控制面板"项 在"控制面板"里找到并双击打开"网络连接" 在"本地连接"上鼠标右键,单击"属性" 进入"常规"选项卡界面,单击"安装" 在选择网络组件类型列表中选中"协议",单击"添加" 在选择网络协议界面中,单击"

怎样解决网络无法链接TCP/IP协议变灰色

  1.使用注册表来设置 步骤1.开始--运行--regedit.exe,打开注册表编辑器,删除以下两个键: HKEY_LOCAL_MACHINESystemCurrentControlSetServicesWinsock HKEY_LOCAL_MACHINESystemCurrentControlSetServicesWinsock2 步骤2.用记事本打开%winroot%infnettcpip.inf文件,找到:[MS_TCPIP.PrimaryInstall]Characteristics

XP系统怎么重置TCP/IP协议?

  XP系统怎么重置TCP/IP协议?           具体方法: 1.单击"开始". 2.选择"运行". 3.在运行框里输入"CMD"后单击"确定". 4.在命令行模式输入命令 netsh int ip reset C:resetlog.txt (其中,Resetlog.txt记录命令结果的日志文件,一定要指定,这里指定了Resetlog.txt 日志文件及完整路径.) 5.运行结果可以查看C:resetlog.txt(

什么是TCP IP 网络TCP IP协议

什么是TCP.IP协议?概括的说TCP/IP协议是(传输控制协议/网间协议)TCP/IP 协议集确立了 Internet 的技术基础.全称Transmission Control Protocol/Internet Protocol.中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.Internet国际互联网络的基础,由 网络层的IP协议和传输层的TCP协议组成.TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准.协议采用了4层的层

win7不小心将TCP/IP协议卸载如何重新安装

  win7不小心将TCP/IP协议卸载如何重新安装 1.右键右下角托盘的网络图标,选择"打开网络和共享中心"; 2.打开后找到里面的"更改适配器设置"; 3.选择本地连接并右键打开"属性",在打开的本地连接属性窗口中点击"常规"选项卡,找到"interne协议"点击"安装"; 4.然后点击"添加";如下图所示: 5.选择网络协议界面中,单击"从磁盘安装&q

Windows7旗舰版系统重装TCP/ip协议的方法

  1.首先打开"开始"―"控制面板",在控制面板中选择点击"网络和共享中心"; 2.在网络和共享中心选择点击"更改适配器设置"项; 3.找到网络设备,单击右键,选择"属性"; 4.在打开的属性界面中,在网络窗口下有一个"Internet 协议版本4(TCP/IPv4)",双击进入; 5.在Internet协议版本属性里设置IP地址,这样就完成了添加安装TCP/IP协议;