TCP/IP三次握手和四次挥手

一、OSI七层模型和TCP/IP四层模型

在这里插入图片描述

应用层 (Application):
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

表示层(Presentation Layer):
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、DECOIC、加密格式等

会话层(Session Layer):
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话

传输层 (Transport):
定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层

网络层 (Network):
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP

数据链路层 (Link):
建立逻辑连接、进行硬件地址寻址、差错校验等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正

物理层(Physical Layer):

是计算机网络OSI模型中最低的一层
物理层规定:为传输数据所需要的物理链路创建、维持、拆除
而提供具有机械的,电子的,功能的和规范的特性

简单的说,物理层确保原始的数据可在各种物理媒体上传输。局域网与广域网皆属第1、2层
物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础
物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境
如果您想要用尽量少的词来记住这个第一层,那就是“信号和介质”

二、TCP报文格式

在这里插入图片描述
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push 有 DATA数据传输)
FIN(finish关闭连接)
RST(reset连接重置)
URG(urgent紧急)

三、三次握手

在这里插入图片描述

在这里插入图片描述
具体过程:
1.第一次握手:Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

2.第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

3.第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

四、四次挥手

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。Client收到ACK之后进如FIN_WAIT_2状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

五、TCP的有限状态机

在这里插入图片描述

六、相关面试题

1、为什么握手是三次,挥手的时候是四次?
答:在握手的时候当server收到client发送的SYN请求时,它可以一次同时的把ACK+SYN发送给client。
而在挥手的时候,当server收到FIN请求的时候,此时TCP处于半连接状态,只代表客户端没有数据再发送了,而server端不一定把所有数据都已经发送至client端了。所以先发送一个ACK表示我已经收到你发来的断开连接请求,等到server端把所有的数据都发送完毕,再给client端发送FIN请求。这样就是比握手的时候多了一次。


2、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:当网络出现问题的时候,TIME_WAIT状态客户端对server端发送的ACK丢失。处在LAST_ACK状态下的server端收不到对已发送ACK+FIN的确认信息,就会认为传送失败。server端就会对ACK+FIN进行超时重传, 而客户端就能在2MSL中收到超时重传的ACK+FIN报文段。接着客户端重传一次ACK报文段,重新启动2MSL计时器。最后A和B都进入CLOSED状态。
如果客户端在TIME_WAIT状态不等待,而是在发完ACK之后直接释放链接。那么就无法收到server重传的ACK+FIN报文段,因而也不会向server再传送ACK,所以server一直处于LAST_ACK状态无法关闭。
所谓的2MSL是两倍的MSL。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接


3、为什么不能用两次握手进行连接?
答:三次握手实现两个功能:1、让双方都做好传输数据的准备。2、让双方对序列号进行协商,这个序列号在握手过程中被发送和确认。
当三次握手变为两次握手则可能会出现死锁的情况。
例如:现在计算机C和S之间进行通信,它们之间采取两次握手的协议。
当C向S发送一个SYN报文段时,S则对C发送一个ACK报文段。按照规定连接已经建立,可以进行数据的传输。
但是当ACK报文段丢失的情况下,S认为连接已经建立可以开始发送数据。但是C在S的应答报文段丢失的情况下不知道S是否已经准备好。在这种情况下,C认为连接没有建立成功,将忽略S发来的所有数据分组,只等待连接确认分组。而在S发出的分组超时后,重复发送同样的分组,这样就形成了死锁。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值