IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP三次握手,四次断开工作过程 -> 正文阅读

[网络协议]TCP三次握手,四次断开工作过程

TCP(transmission Control Protoco )? 协议属于计算机网络体系中的运输层,运输层主要的任务是负责向主机中应用层进程之间的通信提供通用的数据传输服务。所以通俗理解tcp协议是进程间的数据通讯传输协议,根据不同的应用,运输层tcp主要使用有tcp和udp两种协议之一。

tcp协议本身是比较复杂的,他包括拥塞控制,可靠传输,流量控制,连接管理等功能,主要特点包含以下几个方面:

tcp 主要的特点

1.tcp是面向连接的协议,程序在使用tcp协议通寻时,必须要先建立tcp连接,好比打电话要通讯线路要连接状态的。

2.tcp连接是点对点的,每条tcp连接只能有两个端口,这个端口就是java网络编程所有的套接字socket ,有IP加端口号组成。

3.tcp连接提供可靠的交付,使用tcp连接传输数据保证无差错,不丢失,不重复并且按顺序到达

4.tcp连接是双向通讯,通讯双方,即能发送数据,也能接收数据。就向我们通话的双方一样

5.tcp面向字节流传输数据,它传送数据时,是把进程交付的数据按照一段段字节流序列传递的,每次传输其中一段字节序列。应用层接受字节序列侯,再将内容还原

tcp 报文格式

既然tcp协议属于运输层,主要负责主机应用层提供进程间的数据传输,所以我们有必要搞清楚

tcp协议运输数据时的形式。tcp协议规定tcp传输数据的单元为tcp数据报。tcp数据报是应用层进程交付数据的封装。tcp数据报由两个部分组成:tcp首部和tcp数据部分

tcp首部:包含许多控制和描述字段,tcp全部功能的体现

tcp数据部分:对于应用层进行交付的的数据,封装后的字节流序列

应用层进程交付的数据被封装tcp报文,然后进行传输,tcp连接保证数据传输的可靠性。

tcp 三次握手:第一次握手但我们的客户端想和服务端传输数据的时候,就会向服务端发送我们的 连接请求报文,也就是把报文里边的syn位置为1,然后客户端就会进入syn_send 状态然后等待服务端的确认消息,并且这时候会把报文里的seq也就是序列号设置为一个操作系统随机生成的一个数字x,第二次握手:当服务端接收到我们客户端发来的syn报文段之后,就需要对我们这个syn请求做出回答,然后会把报文里边的ack设置为1,并且还要把确认序号设置为刚发送seq中的x+1,并且同时自己还要发一个syn请求给客户端,并将syn的值变成1,然后seq设置操作系统随机生成一个y,然后服务端把上边的数据发送出去,这时候服务端变成syn_recv状态,第三次握手:当客户端收到服务端发来的报文的时候,会把ack中的值设置为刚生成的y+1,然后seq设置为x+1和第二次的握手的值一样,然后再发服务端,当这个数据包发送完毕,客户端和服务端都会进入established建立状态,这时候完成了三次握手。

tcp 四次挥收:第一次主动关闭方a向被动方一方发送断开请求,在发送数据包的时候把tcp首部的fin设置为1,ack 设置为1,seq设置为x,也就是上次对方发过来的ack值,ack设置为上次对方传来的seq+1,这时候把数据包发送给被动方b,然后a就进入了fin_wait_1 状态,等待被动关闭的回应。

第二次:被动方关闭的一方收到了a发送来的fin包,明白a要关闭,这时候b就需要向a做出回复,将标志位ack设置为1,然后把ack数值设置为a发来的seq序列号+1,seq设置为a发来的ack值,然后b进入close_wait ,当a收到b的这个回复之后a就会进入fin_wait_2状态。

第三次:b再次发送报文,就是告诉a我也要关了,把首部的fin值设置为1,ack设置为1,然后ack设置为1,ack数值设置为第二次握手时的ack,seq,设置为第二次握手中的seq,然后b就进入了last_ack,状态,当收到b的这一条之后,就会进入time_wait状态。

第四次:a收到b发送的第三次断开的fin报文之后,会和第二次握手b回复a一样回复b报文,将ack设置1,ack为第三次断开的seq+1,seq设置为第三次断开中的ack+1,然后a进入了Time_wait状态,b收到a这次发的报文之后进入了closed状态,当a在发送完这个报文之后等2msl时间后就进入closed状态??

?

一.优雅回答三次握手:

服务端新建套接字,绑定地址信息后开始监听,进入listen状态,客户端新建套接字绑定地址信息后调用connect,发送链接请求syn,并进入syn_send状态,等待服务器的确认。服务器一旦监听到连接请求,就会将连接放进内核等待队列中,并向客户端发送syn和确认报文段ack,进入syn_recd状态。客户端收到syn+ack报文段向服务端发送确认报文段ack,并进入Established状态,开始读写数据。服务器一旦收到客户端的确认报文,就进入established状态,就可以进行读写数据了。

为什么握手需要三次,而不是两次或者四次:

两次不安全,四次没必要。因为tcp通讯需要确保双方都具有数据收发能力,第一次握手检验到了客户端的发送能力和服务端的接收能力。第二次握手是检验服务端发送是否正常,但不能确定客户端的接收是否正常,第三次握手客户端发送ack确认,服务端得出客户端具有收发能力,服务端也收发正常。

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

握手失败的原因有两种,第一种什么都不做,因为没有收到syn ,第二种发送了syn+ack没回应,超时就会发送rst重置报文,释放资源。

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

第一次,第二次握手不携带数据。而第三次握手是可以携带数据的。假设携带会遭到恶意攻击服务器,每次都在第一次握手syn报文放入大量数据,重复发送大量syn报文,造成服务器消耗大量资源缓冲这些报文,服务器更容易被攻击。

lsn代表什么?意义何在?isn是固定不变的吗?isn为何要动态随机?

lsn是字节数据编号的原点告诉对方我要发送数据的初始化序列号,不固定,如果固定被攻击者猜到了序的确认号,为安全发送伪造rst报文,因此是动态生成的。

什么是半连接队列?

服务器第一次收到客户端的syn之后,就会处于syn_recd状态,此时双方还没有完全建立连接。服务器会把这种状态下的请求连接放在一个队列里,我们把这种队列称为半连接队列,当然还有一个全部队列,就是已经完成三次握手,建立起来连接就放在全连接队列中,如果队列满了就可能出现丢包现象。

?

?

优雅回答四次挥手:

四次挥手:客户端主动调用close时,向服务端发送结束报文FIN包,同时进入fin_wait1状态;服务器会收到结束报文fin报,服务器返回确认报文段ack并且进入CLOSE_WAIT状态,此时如果服务器端有数据要发送的话,客户端依然需要接收,客户端接受到服务端结束报文段的确认,就会进入到FIN_WAIT2状态,开始等待服务器的结束报文段服务器端数据发送完毕后,当服务器真正调用close关闭连接时,回向客户端发送结束报文fin包,此时服务器进入LAST_ACK状态,等待最后一个ack的到来。客户端收到服务端发来的结束报文端,进入time_wait,并发送出确认报文段ACK,服务器收到了对结束报文段确认的ack,进入closed状态断开连接。而客户端等待2msl的时间,才会进入到closed状态。

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

其实在tcp握手的时候,接收端将syn包和ack确认饱和并到一个包中发送的,所以减少了一次包的发送。对于四次挥手,由于tcp是全双工通信,主动关闭方发送fin请求不代表完全断开连接,只能表示主动关闭不再发送数据,而接受方可能还要发送数据,就不能立即关闭服务器到客户端的数据通讯,所有就不能将服务端到客户端的fin包和ack包合并发送,只能先确认ack,等服务端发送数据完毕再发fin包,所以四次挥手时需要四次数据包的交互。

为什么time_wait 状态需要经过2msl才能进入close状态:

msl指的是报文在网络中最大生存空间,在客户端发送对服务的fin确认报ack后,这个ack包可能到不了,服务器如果没有接到ack包就重新发送fin包,所以客户端发送ack后需要流出2msl时间即是(ack到服务端的时间+服务端发送的fin重传包),也就是客户端等待2msl时间没有收到服务器重传的fin包,则就可以确认服务器已经收到客户端的ack包

为什么time_wait状态有什么作用,为什么主动关闭方没有直接进入closeed状态释放资源?

如果自动方关闭进入closed状态,可能被动方没有收到ack确认包, 超时再重发一个fin包,下次启动新客户端就可能使用了与之前客户端相同的地址信息,有两个危害,第一种新客户端绑定地址时,就会收到了一个重传的fin包,对连接有影响,第二种是该客户向相同的服务端发送syn连接请求,但是此时服务器处于last_ack状态,要求收到ack确认而不是syn,因此就会发出rst重新建立请求。

一台主机上出现大量的time_wait是什么原因?应该如何处理?

time_wait? 是主动方关闭出现的,一台主机出现大量的time_wait证明这台主机上发起大量主动方关闭连接。常见一些爬虫服务器。这时候我们·应该调整TIME_WAIT等待时间,或者开启套接字地址重用选项。

一台主机上出现大量的close_wait是什么原因?应该如何处理?

close_wait 是被动方关闭收到fin请求进行回复之后的状态,等待上层程序进一步处理,若出现大量close_wait,有可能是被动关闭方主机程序中忘记最后一步断开连接后调用close释放资源,这是一个bug,只需要加上对应close即可解决问题。

tcp连接管理中的保活机制

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

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:51:43  更:2021-10-20 12:52:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/1 21:34:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码