TCP/IP协议详解

本文详细介绍了TCP/IP协议中的三次握手和四次挥手过程,包括为何需要三次握手来建立连接以及为何挥手需要四次。内容涉及TCP/IP协议的层次结构,TCP连接的可靠性,半连接队列,以及连接管理和保活机制。通过三次握手确保双方的发送和接收能力,四次挥手则是因为TCP的全双工特性,确保数据传输完成后释放资源。
摘要由CSDN通过智能技术生成

参考链接:
http://www.ha97.com/3215.html
https://blog.csdn.net/qq_44443986/article/details/115966274

TCP/IP协议

在这里插入图片描述

OSI 7层参考模型

在这里插入图片描述

TCP/IP协议

TCP属于传输层,HTTP属于应用层,IP在网络层。

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
在这里插入图片描述
TCP/IP协议中的应用层其实相当于OSI中 应用层、表示层、会话层的整合。

在这里插入图片描述

数据传输层 TCP UDP

TCP/IP网络传输中的数据术语

在这里插入图片描述

TCP解决什么问题?

面向连接的、可靠的传输。

连接到底是什么?
三次握手 >> 建立连接,数据传输 >> 四次分手

注意:长连接和短连接不是在数据传输层实现的,是在应用层实现的,使用应用程序控制的。

三次握手

在这里插入图片描述
tcp通信需要确保双方都具有发送、接受数据的能力。

  • 第一次握手,是由客户端发送SYN包,服务器端接收。 服务端得出客户端的发送能力和服务器端接受能力都正常。

  • 第二次握手,是服务器端发送SYN+ACK包,客户端接收。 客户端得出客户端的发送能力,服务器端的接受、发送能力正常。但是此时,服务器端不能确认服务器端发送能力和客户端接收能力是否正常。

  • 第三次握手,是客户端发送ACK包,服务器端接收。 服务端得出服务器端收发能力正常,客户端收发能力正常。

什么是连接

在这里插入图片描述

其实就是客户端、服务器端开辟资源切换状态。

两方开辟资源,保证向资源中的发送、接收队列放入、获取数据。

当连接建立之后,对于程序员来说,就相当于socket,对资源进行包装。

APP是和自身内核打交道,将数据放入发送队列或从接收队列中读取。

为什么是三次握手,而不是两次或四次?

两次不安全,四次没必要。

三次握手可以携带数据吗?

第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。

假设第一次可以携带数据,如果有人恶意攻击服务器,每次都在第一次握手中的SYN报文放入大量数据,重复发送大量SYN报文,此时服务器会花费大量内存空间来缓冲这些报文,服务器就更容易被攻击了。

tcp三次握手失败,服务端会如何处理?

握手失败的原因有两种。

第一种是服务端没有收到SYN,则什么都不做;

第二种是服务端回复了SYN+ACK后,长时间没有收到ACK响应,则超时后就会发送RST重置连接报文,释放资源。

什么是半连接队列

服务器第一次收到客户端的SYN之后,就会处于SYN_RECD状态,此时双方还没有完全建立连接。

服务器会把这种状态下的请求连接放在一个队列里,我们把这种队列称之为半连接队列

当然还有一个全连接队列,就是已经完成三次握手,建立起来连接的就会放在全连接队列中,如果队列满了就有可能出现丢包现象。

四次分手

四次分手分的是连接,其实也就是资源的释放。

在这里插入图片描述
在这里插入图片描述

  • 客户端主动调用close,向服务器端发送结束报文端FIN包,同时进入FIN_WAIT_1状态。
  • 服务器端会收到结束报文段FIN报,服务器端返回确认报文段FIN+ACK包并进入CLOSE_WAIT状态,此时如果服务器端有数据要发送,客户端依然需要接收。客户端接收到服务器端对结束报文的确认,会进入FIN_WAIT_2状态,开始等待服务器端结束报文段。
  • 服务器端数据发送完毕后,当服务器真正调用close关闭连接时,会向客户端发送结束报文段FIN包,此时服务器进入LAST_ACK状态,等待最后一个ACK包的到来。
  • 客户端收到服务器端发来的结束报文段,进入TIME_WAIT状态,并发送出确认报文段ACK;服务器端收到了结束报文段ACK包,进入CLOSED状态,断开连接;而客户端要等待2MSL的时间,才会进入CLOSED状态。

为什么握手是三次,而挥手时需要四次呢?

其实在TCP握手的时候,接收端将SYN包和ACK确认包合并到一个包中发送的,所以减少了一次包的发送。

对于四次挥手,由于TCP是全双工通信,主动关闭方发送FIN请求不代表完全断开连接,只能表示主动关闭方不再发送数据了。而接收方可能还要发送数据,就不能立即关闭服务器端到客户端的数据通道,所以就不能将服务端的FIN包和对客户端的ACK包合并发送,只能先确认ACK,等服务器无需发送数据时在发送FIN包,所以四次挥手时需要四次数据包的交互

为什么TIME_WAIT状态需要经过2MSL才能进入CLOASE状态?

MSL指的是报文在网络中最大生存时间。在客户端发送对服务端的FIN确认包ACK后,这个ACK包有可能到达不了,服务器端如果接收不到ACK包就会重新发送FIN包。所以客户端发送ACK后需要留出2MSL时间(ACK到达服务器器+服务器发送FIN重传包,一来一回)等待确认服务器端缺失收到了ACK包。也就是说客户端如果等待2MSL时间也没收到服务器端重传的FIN包,则就可以确认服务器已经收到客户端发送的ACK包。

tcp连接管理中的保活机制

tcp通信中,若两端长时间没有数据往来,则这时候每隔一段时间,服务端会向客户端发送一个保活探测数据报,要求客户端进行回复。若连续多次没有收到响应,就认为连接已经断开。长时间默认为7200s,每隔一段时间默认为75s,连续多次无响应默认为9次。 这些数据都可以在套接字中修改,接口:Setsockopt

Mac地址

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张矜持

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值