网络基础---TCP连接

转载 2018年04月17日 10:57:59

TCP协议原理:TCP每发送一个报文段,就启动一个定时器,如果在定时器超时之后还没有收到ACK确认,就重传该报文。 如图所示,数据包由A的缓冲区发往B,B在收到数据包以后,回发一个ACK确认包给A,之后A将该数据包从缓冲区释放。因此,该数据包会一直缓存在A的缓冲区,直到一个ACK确认为止。
这里写图片描述

在TCP/IP协议中,TCP协议提供可靠的面向连接的服务;三次握手(建立连接)和四次挥手(关闭连接);使用滑动窗口机制进行流量控制;
三次握手的详细图解
所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。如图1所示。
这里写图片描述
图1 三次握手建立TCP连接的各状态
(1)第一次握手:建立连接时,客户端A发送SYN包[SYN=1,seq=x]到服务器B,并进入SYN_SEND状态,等待服务器B确认。
(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN,同时自己也发送一个SYN包,即SYN+ACK包[SYN=1,ACK=1,seq=y,ack=x+1],此时服务器B进入SYN_RECV状态。
(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK[ACK=1,seq=x+1,ack=y+1],此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据。
三次握手完成后,客户端和服务器就建立了TCP连接。这时可以调用accept函数获得此连接三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换TCP 窗口大小信息。在socket编程中,客户端执行connect()时,将会触发三次握手
四次挥手的详细图解
TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。TCP要保证在所有可能的情况下使得所有的数据都能够被投递,当你关闭一个socket时,主动关闭一端的socket将进入TIME_WAIT状态,而被动关闭一方则转入CLOSED状态 ,这能够保证所有的数据都被传输。
这里写图片描述
图2 四次挥手关闭TCP连接的各状态
(1)首先A B端的TCP进程都处于established状态, 当A的应用程序传送完报文段,就会去主动关闭连接。A会停止发送报文段(但是还会接收),并向B发送[FIN = 1,seq=u]数据,之后进入FIN-WAIT-1状态;
(2)B接收到A发送的请求之后,会通知应用进程,A已经不再发送数据,同时B会向A发送ACK确认数据[ACK=1,seq=v,ack=u+1 ],B进入CLOSE-WAIT状态,A接收到B发送的数据之后,A进入FIN-WAIT-2状态;此时A到B方的连接已经关闭了(即半连接状态)。
(3)当B的应用进程发现自己也没有数据需要传送,B应用进程就会发出被动关闭的请求,B此时向A发送[FIN=1,ACK=1,seq=w,ack=u+1]数据,并且进入LAST-ACK状态;
(4)A接收到B发送的数据之后,向B发送ACK确认数据[ACK =1,seq=u+1,ack=w+1],进入TIME-WAIT状态,等待2MSL之后正常关闭连接进入CLOSED状态;B接收到A发送的确认之后进入CLOSED状态。B到A方的连接关闭!至此,TCP连接才真正全部关闭!
几个问题:
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到客户端的SYN报文的建立连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到 ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于 LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的 ACK报文。
3.TCP报文段
这里写图片描述
TCP报文段也分为首部和数据两部分,首部默认情况下一般是20字节长度,但在一些需求情况下,会使用“可选字段”,这时,首部长度会有所增加。
TCP首部报文信息中,有一个状态控制码(Code,Control Flag),也叫标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:
URG:紧急比特(urgent)。当URG=1时,表明紧急指针字段有效,代表该封包为紧急封包。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据), 且上图中的 Urgent Pointer 字段也会被启用。
ACK:确认比特(Acknowledge)。只有当ACK=1时确认号字段才有效,代表这个封包为确认封包。当ACK=0时,确认号无效。
PSH:(Push function)。若为1时,代表要求对方立即传送缓冲区内的其他对应封包,而无需等缓冲满了才送。
RST:复位比特(Reset) 。当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
SYN:同步比特(Synchronous)。SYN置为1,就表示这是一个连接请求或连接接受报文,通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。
FIN:终止比特(Final)。用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

*传输数据过程*TCP报文的首部格式中确认号的计算:
确认号是期望收到对方下一个报文段的第一个数据字节的序号。
序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和

4.在已经成功建立连接的TCP连接,在以下四种情况时会导致TCP产生严重错误,发送RST包
1、端口未打开
2、请求超时
3、提前关闭
4、在一个已关闭的socket上收到数据

unix网络基础-TCP连接的建立和终止(记录)2

TCP连接的建立和终止(记录)2 tcp涉及连接建立和连接终止的操作可以用状态转换图来表示。 TCP为一个连接定义了11种状态,并且规则规定如何基于当前状态及在该状态下所接收的分节从一个状...
  • CSLQM
  • CSLQM
  • 2016-12-05 12:28:57
  • 286

图解HTTP之一--网络基础(TCP/IP、DNS)

网络基础TCP/IP1. TCP/IP协议族计算机与网络设备要相互通信,双方就必须基于相同的方法。比如:如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。...
  • u014346301
  • u014346301
  • 2017-01-10 17:05:58
  • 1420

TCP/IP 教程(针对LINUX的网络基础请参看 《鸟哥的Linux私房菜 服务器架设篇(第三版) 》)

TCP/IP 是针对因特网的通信协议。 在此教程中,你将了解到什么是 TCP/IP,以及它如何工作。开始学习 TCP/IP ! TCP/IP 是因特网的通信协议。 通信协议是对计算机必须遵...
  • u010794281
  • u010794281
  • 2015-09-16 18:31:13
  • 1738

《图解TCP/IP》第一章 网络基础知识

计算机网络,根据其规模可分为WAN(Wide Area Network, 广域网 ), 和LAN(Local Area Network, 局域网)。 广域网 局域网 计算机与网络发展的7个...
  • u011389977
  • u011389977
  • 2016-05-21 20:38:17
  • 1398

【网络基础】TCP协议之三次握手和四次挥手

前面提到了TCP数据报以及TCP是通过什么进行可靠传输的,相关知识点请关注下面的博客: http://blog.csdn.net/bit_clearoff/article/details/60469...
  • bit_clearoff
  • bit_clearoff
  • 2017-03-05 21:37:08
  • 399

如果网络出现异常,TCP连接中断,那么计算机要多久才能够检测出来呢?

如果网络出现异常,TCP连接中断,那么计算机要多久才能够检测出来呢? 最佳答案 这个问题得分情况来说: 1、双方只建立了一个连接,然后就再也没有任何数据通信,这完全是可能的。这时,t...
  • lsfa1234
  • lsfa1234
  • 2011-03-04 14:00:00
  • 4745

TCPIP协议详解----网络基础知识

计算机网络的发展关于计算机网络的发展不做介绍 , 想要详细了解的同学可以搜索相关资料,进行查看1.协议在计算机网络中我们经常提到协议一词,互联网中具有代表的协议有HTTP、TCP、UDP等等,在平常我...
  • lp178116060
  • lp178116060
  • 2016-12-06 16:57:03
  • 1697

java工程积累——tcp/ip连接

公司的项目,在计划之中,如期上线,当然也在计划之中,出现了问题,这些我们都计划到了,但是,还是让我意料到了,我终于高兴地遇到了,我一个不太理解的问题!大家跟着我的描述,一起来看看,这个问题带给我们的困...
  • xvshu
  • xvshu
  • 2015-01-21 22:57:07
  • 1470

linux网络基础编程示例

  • 2010年11月28日 18:05
  • 102KB
  • 下载

运输层—TCP的连接管理

TCP是面向连接的协议,TCP的运输连接有三个阶段:建立连接、数据传送、连接释放。 我们通过下面的图来理解TCP的连接: 首先,最初两端的TCP进程都处于一种CLOSD的状态,A作为客户,B作为服...
  • nineteen_
  • nineteen_
  • 2015-12-31 19:22:49
  • 646
收藏助手
不良信息举报
您举报文章:网络基础---TCP连接
举报原因:
原因补充:

(最多只允许输入30个字)