- 轻量级网站评论系统Commento安装教程 - 2024年8月25日
- CMS超级播放器artplayer、dplayer跳过片头片尾源码 - 2024年8月19日
- Google Adsense 申请记录 - 2024年8月14日
TCP三次握手
在进行tcp三次握手讲解之前先需要先认识tcp报文段首部的几个字段及其他们的作用
1、 ACK 只有当ACK置1时 ack确认号才有效
2、 SYN 在建立连接时用来同步序号,当SYN=1,ACK=0时表明这是一个请求报文段
3、 FIN 终止 当FIN为1时表名此报文段的发送方数据已经发送完毕,并且请求释放连接
SYN和FIN的作用相似只是一个用于请求连接,一个用于请求释放连接
4、 ack(确认号) 期望收到对方下一个报文段的序号,同时也说明自己已经收到的报文段序号,例如:ack=x+1;表示期望收到的下一个报文段的序号为x+1,并且序号为x的报文段已经收到。
5、 seq序号,因为tcp是面向连接的传输方式,通过序号可确认是否有数据丢失,表示当前报文段的序号。
三次握手
先大体描述整个过程:
一、 客户端请求连接
二、 服务端收到请求,并发送确认
三、 客户端收到确认并向服务端发送确认
为什么需要第三步:如果只有前面两个步骤的话会存在这样一种情况:客户端发送请求后久久没收到服务端的确认(但请求消息依然是在网络中的),所以就主动断开了这次连接,过了一段时间后服务端收到请求,就会一直等待客户端发送数据,而实际上客服端已经断开了连接,这样就会造成服务端资源的浪费。
下面是具体的一个过程:每个过程与上面是相对应的
一、客服端将TCP报文段的首部的 SYN置1,ACK依然为零,同时seq=x(x为随机产生的数)将该TCP报文段发送给服务端,此时客户端进入SYN-SENT(同步已发送)状态。该报文段是不能携带数据的,但依然消耗掉一个数据。
二、服务端收到该报文段后知道这是一个请求报文,所以就将TCP首部中 SYN置1,ACK也置1(需要确认),同时seq=y(y也是随机产生的),ack=x+1,表示自己已经收到序号为x的报文段期望下次收到的报文段的序号为x+1。服务端就进入SYN-RCVD(同步收到)状态。该报文段也是不能携带数据的,但依然消耗掉一个数据。
三、客服端收到报文段后将自己的TCP报文段的首部的ACK置1(需要确认),同时ack=y+1,(说明已经收到服务端序号为y的报文段,希望下次收到的报文段为y+1),同时seq=x+1;客户端进入ESTABLISHED(已建立连接)状态
服务端收到确认后也进入了ESTABLISHED(已建立连接)状态。心有多大,天有多高,一起奋斗!!
评论0