详述TCP三次握手和四次挥手的过程。

1.TCP的介绍

  TCP(传输控制协议),位于OSI模型中的传输层,与它经常一块被提及的协议为UDP。

2.TCP的首部格式

注解:

(1)源/目的端口号:表示数据是从哪个进程来到哪个进程去;

(2)序号:([0,2^32-1]),TCP连接中传送的字节流,每一个字节都按需编号,当序号增加到2^32-1之后,下一个又回到0.

(3)确认号:期望收到对方下一个报文段的第一个数据字节的序号。【确认号=N:表明到序号N-1为止的所有数据都已正确收到】

(4)4位首部长度:表示该TCP头部有多少个32位bit位(即有多少个4字节),因为4位二进制数能够表示的最大十进制数字是15,所以TCP首部最大长度为60字节,一般采用标准长度:20个字节。

(5)6位标志位

       a.URG:表示紧急指针是否有效(当URG=1时,此时带有URG的数据会被优先处理)

       b.ACK:表示确认号是否有效

       c.PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走

       d.SYN:在建立连接的时候用来同步序号

       e.RST:对方要求重新建立连接,把携带RST标识的称为复位报文段

       f:FIN:通知对方,本端要关闭了,把携带FIN标识的称为结束报文段。

(6)窗口大小:接收方告诉发送方从该报文首部中的确认号算起,自己接收缓冲区的大小(即能允许发送方发送的数据量)

3.TCP三次握手【创建连接的过程】

    图解:

       

第一次握手

    客户端发送一个SYN为1的TCP报文段,表明客户端向服务器发出连接请求,以及初始序号X保存在报头的序列号字段里【TCP规定SYN报文段不能携带数据,但要消耗一个序列号】,即TCP第一握手后的首部格式为:

    第二握手:服务器接收到客户端发送的连接请求,向客户端发送确认,此时SYN,ACK均被置为1,同时服务端也要消耗自己的一个序列号,确认号为ack=ack+1,即X+1,还要发送自己的序号seq=Y;TCP第二次握手后的首部格式变为:

第三次握手:客户端收到服务端的确认之后,还要向服务端发送确认告诉服务器自己收到服务器的确认,此时SYN=0,ACK=1,seq=X+1,ack=Y+1;则TCP第三次握手后的首部格式为:

其实从上述的TCP过程中可以发现,TCP三次握手的实质,其实就是客户端与服务端之间交换三个TCP报文段。

SYN攻击(是一种典型的D-DOS攻击):

     攻击客户端,在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器需要不断地重发直至超时,这些伪造的SYN包长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

4.TCP的四次挥手【即断开连接的过程】

图解:

第一次挥手

客户端向服务端发送连接释放报文段,并停止发送数据,此时FIN=1,seq=u,进入FIN-WAIT1状态,等待客户端的确认。

则TCP第一次挥手之后的首部格式为:

第二次挥手:

    服务端收到客户端发送的的连接释放报文之后,对客户端发出确认,此时ACK=1,确认序号为ack=u+1,自己的序号为w,

客户端在接收到服务端的确认后,进入FIN-WAIT2状态,等待服务端发送连接释放报文段。TCP第二次挥手之后的首部格式为:

第三次挥手:

    因为TCP协议是全双工的, 前两次挥手只是表明客户端没有数据要发送给服务端,并不表示,服务端没有数据要发送给客户端,此时若服务端向客户端发送连接释放的报文段,则ACK=1,FIN=1,seq=w,还要重发上次已经发送过的确认号ack=u+1;这时服务端就进入LAST—ACK状态,等待客户端确认。

即,TCP进行第三次挥手之后的首部格式为:

第四次挥手:

      客户端收到服务端发送的报文段之后,进行确认,此时,ACK=1,ack=w+1,seq=u+1,服务端收到客户端的确认之后就关闭连接,而客户端在经过2MSL后也关闭连接。此时TCP首部格式为:

5.为什么握手是三次,而挥手是四次呢?

      (1)握手是三次:在TCP建连接的时候,服务器对客户端发送的连接请求进行确认的时候,可以先发送一个确认报文段(ACK=1,ack=x+1),然后再发送一个同步报文段(SYN=1,seq=y),此时TCP创建连接的过程就变成了四次握手,但和三次握手的效果是一样的;

       (2)挥手是四次:因为TCP是提供全双工通信的,已上图四次挥手图解为例,前两次挥手只表明客户端没有数据要发给服务端,而不能说明服务端没有数据发给客户端,所以服务端没有数据要发的时候也要进行两次挥手,所以整个释放连接的过程就是四次挥手啦。

6.TCP创建连接的过程为什么不是两次握手?

     假设TCP创建连接的时候是两次握手,假设服务端发送给客户端的确认,在传输的时候丢包了,那么对于服务端来讲,服务端,认为连接创建成功,等待客户端发送数据,而对于客户端来说,它在TCP第一次握手之后一直等待服务端确认,而服务端的确认在传输过程中丢包,所以此时对于客户端而言,它认为连接没有创建成功,所以会向服务端重新发送连接请求,这个时候呢,服务端就要花费资源去维护,如果有大量的客户端发生这种情况,那么服务器就会浪费很多的资源,甚至会挂掉。

7.为甚四次挥手释放连接时等待2MSL?

     (1)为了保证客户端发送的最后一个ACK报文段能够到达服务端

        在TCP进行第四次挥手时,客户端发送给服务端的ACK报文段有可能丢失,所以服务端收不到客户端的确认,此时服务端会超时重传ACK+FIN报文段,因而客户端就能够在这2MSL内收到服务端重传的报文段,然后对其进行确认,重新启动2MSL,最后客户端和服务端都进入CLOSED状态。

   (2)防止“已失效的连接请求报文段”出现在本连接中

        A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,这样就不会使已失效的连接请求报文段出现在新的连接中。

8.TCP 和 UDP的区别

   (1)UDP是无连接的,TCP是有链接的,TCP在发送数据之前TCP的客户端与服务端必须通过三次握手创建连接,数据传输完成之后,必须通过四次挥手释放连接;

   (2)UDP传输数据是尽最大努力交付的(即不可靠),TCP协议通过保证数据按序到达,确认应答,提供超时重传来保证可

靠性;

  (3)UDP是定长报头(8个字节),TCP的首部最大长度是60字节(标准是20字节);

  (4)TCP有流量控制和拥塞控制,UDP没有,网络堵塞不会影响发送端的发送速率;

  (5)UDP面向数据报,TCP面向字节流;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值