TCP/IP协议

网络协议

TCP/IP(Transmission Control Protocol / Internet Protocol)中文译为传输控制协议/因特网互联协议,TCP/IP是四层传输协议,从上到下分为①应用层、②传输层、③网际层( 用网际层这个名字是强调这一层是为了解决不同网络的互连问题) 、④网络接口层。另一个耳熟能详的ISO/OSI七层传输协议,OSI(Open System Interconnection) 是国际标准化组织(International Organization for Standardization,ISO) 设计的计算机通用的网络通信基本框架,但已被淘汰。不过从实质上讲,TCP/IP 只有最上面的三层,因为最下面的网络接口层并没有什么具体内容,因此在学习计算机网络的原理时往往采用折中的办法,即综合 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚,有时为了方便,也可把最底下两层称为网络接口层。

在这里插入图片描述

  • 四层协议:①应用层、②传输层、③网际层、④网络接口层
  • 七层协议:①应用层、②表示层、③会话层、④运输层、⑤网络层、⑥数据链路层、⑦物理层
  • 五层协议:①应用层、②运输层、③网络层、④数据链路层、⑤物理层

TCP建立连接

三次握手(TCP建立连接的三个步骤)

在学习TCP连接之前,先来了解一下TCP报文的头部结构。

img

上图中有几个字段需要重点介绍下:

(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。

(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:其中标志位有3个比较重要:SYN(Synchronize Sequence Numbers)用作建立连接的同步信号;ACK(Acknowledgement)用于对收到的数据进行确认,所确认的数据由确认序列号表示;FIN(Finish)表示后面没有数据需要发送,通常意味着所建立的连接需要关闭了。SYN、ACK、FIN都以置1表示有效。

需要注意:不要将确认序号ack和标志位ACK搞混淆了;确认方ack=发起方seq+1。

A机器是客户端角色,B机器是服务器角色,服务器需要客户端发起连接建立请求时先打开某个端口等待数据传输,否则无法正常建立连接。图1-18展示了正常情况下三次握手具体步骤:

在这里插入图片描述

  • 第一次握手:客户端向服务器端发起连接请求,首先客户端随机生成一个初始序列号seq=x(假设x是100),客户端向服务器端发送的SYN报文段包含SYN标志位(即SYN=1),序列号seq=x=100。此时,客户端进入SYN_SENT(同步已发送)状态。

    初始序列号(即Initial Sequence Number,ISN)

  • 第二次握手:服务器端收到客户端发过来的SYN报文段后,发现SYN=1,得知这是一个建立连接的请求,于是将客户端的序列号seq=x=100保存起来,并且随机生成一个服务器端的初始序列号seq=y(假设y是200)。然后服务器端向客户端发送一个确认报文段ACK报文段包含SYN和ACK标志位(即SYN=1,ACK=1),序列号seq=y=200,确认序列号ack=x+1=101(客户端发送的序列号+1)。此时,服务器端进入SYN_RCVD(同步已收到)状态。

  • 第三次握手:客户端收到服务器端的ACK报文段后发现ACK=1且ack=101,知道服务器端收到了序列号为100的SYN报文段;同时发现SYN=1,表示服务器端同意了此次连接请求,于是将服务器端的序列号seq=y=200保存起来,然后向服务器端发送确认报文段ACK报文段包含ACK标志位(即ACK=1),序列号seq=x+1=101( 第一次握手时客户端发送报文的序列号seq是100,所以第三次握手的序列号就seq从101开始,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时序列号seq还是101 ),确认序列号ack=y+1=201(服务器端序列号+1)。此时,客户端进入ESTABLISHED(连接已建立)状态。服务器端发现收到的ACK报文段包含ACK=1且ack=201,就知道客户端收到了序列号为200的报文。 此时,服务器端也进入ESTABLISHED(连接已建立)状态。这样客户端和服务器端就建立了TCP连接。

TCP建立连接为什么需要3次握手?

主要是确认通信双发收发数据的能力。通信双方只有确定4类信息(自己发报能力、自己收报能力、对方发报能力、对方收报能力),才能建立连接。在第2次握手以后,从B机器视角看还有两个红色的No信息无法确认。在第3次握手后,B机器才能确认自己的发报能力和对方的收报能力是正常的。

在这里插入图片描述

TCP断开连接

四次挥手(TCP断开连接的四个步骤)

TCP是面向连接的全双工通信,双方都能作为数据的发送方和接收方,TCP建立连接需要3次,但是断开连接却需要4次,图1-23展示了正常情况下四次挥手的具体步骤:

在这里插入图片描述

假如客户端的初始化序列号ISN=100,服务器端的初始序列号ISN=200,TCP连接建立后客户端总共发送了3000个字节的数据,服务器端在客户端发送FIN报文前总共回复了4000个字节的数据。

  • 第一次挥手:当客户端的数据都传输完成后,客户端向服务器端发出连接释放报文段,并停止发送数据(当然数据没发完时也可以发送连接释放报文段并停止发送数据),主动关闭TCP连接。FIN报文段包含FIN标志位(即FIN=1)、序列号seq=u=3101(它等于前面已传送过的数据的最后一个字节的序号加1,即100+1+3000,其中的1是建立连接时占的一个序列号)。此时,客户端进入FIN_WAIT_1(终止等待1)状态。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。
  • 第二次挥手:服务器端收到客户端发出的FIN报文段后随即发出确认,ACK报文段包含ACK标志位(即ACK=1),序列号seq=v=4200(即200+4000),确认序列号ack=u+1=3102(即3101+1)。此时,服务器端进入CLOSE_WAIT(关闭等待)状态。这个状态可能要持续一段时间,而不是立刻给服务器端发送FIN报文段,因为服务器端可能还有数据没发完。客户端收到服务器端的ACK报文段后,就进入FIN_WAIT_2(终止等待2)状态。等待服务器端发出FIN报文段。
  • 第三次挥手:当服务器端将最后50字节的数据发送完毕,再没有数据要发送给客户端时。服务器端向客户端发出连接释放报文段,此FIN报文段包含FIN和ACK标志位(即FIN=1、ACK=1),seq=w=4250(即4200+50),确认序列号ack=u+1=3102。此时,服务器端就进入了LAST_ACK(最后确认)状态,等待客户端的确认。
  • 第四次挥手:当客户端收到服务器端发出的FIN报文段后,会向服务器端发出确认报文段,ACK报文段包含ACK标志位(即ACK=1),序列号seq=u+1=3102,ack=w+1=4251。注意客户端发出确认报文段后不是立刻断开TCP连接,而是经过2MSL(Maximum Segment Lifetime,最长报文段寿命)后,没有收到服务器端传来的报文,才会断开连接。此时,客户端进入CLOSED(关闭连接)状态。服务器端收到ACK报文段后,立即断开连接,进入CLOSED(关闭连接)状态。这样客户端和服务器端就断开 了TCP连接。

TIME_WAIT:表示主动关闭产生的阶段性状态,只有主动要求关闭的机器表示收到了对方的FIN报文,并发送出ACK报文,进入TIME_WAIT状态,等2MSL后即可进入CLOSED状态。如果FIN_WAIT_1状态下,同时收到待FIN标志和ACK标志的报文时,可以直接进入TIME_WAIT状态,则无须经过FIN_WAIT_2状态。

CLOSE_TIME:表示被动阶段产生的阶段性状态,被动要求关闭的机器收到对方请求关闭连接的FIN报文,在第一次ACK应答后,马上进入CLOSE_TIME状态。这种状态其实表示在等待关闭,并且通知机器发送完剩余数据,等待关闭相关资源。

为什么第四次挥手后客户端要等2MSL的时间才能释放TCP连接?

在TIME_WAIT等待的2MSL是报文在网络上生存的最长时间,超过阈值的报文会被丢弃。一般来说,MSL大于TTL衰减至0的时间。这里主要是要考虑丢包的问题,如果第四次挥手的报文丢失,服务器端没收到确认ACK报文端就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到了。

为什么TCP建立连接需要3次握手,而断开连接需要4次挥手?

当数据传输完毕时,通信的双方都可以请求断开连接。客户端第一次挥手发出FIN报文后只能保证客户端没有数据要发送,而服务器端还有没有数据要发客户端是不知道的。所以服务器端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端 服务器端已经收到你的FIN报文了,但服务器端还有一些数据没发完,等这些数据发完 服务器端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值