zoukankan      html  css  js  c++  java
  • 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(已建立连接)状态。

    心有多大,天有多高,一起奋斗!!
  • 相关阅读:
    ios开源项目2
    Cocoa 框架 For iOS(一) 框架的介绍
    iPhone开源项目大全
    8款iOS的日历开源代码
    二维码扫描工具和开发包 ZBar
    图文解释XCode常用快捷键的使用
    常用的iOS高效开源类库
    static_cast
    [转]SecureCRT rz 上传文件失败问题
    Linux中的EAGAIN含义
  • 原文地址:https://www.cnblogs.com/zhaolei1996/p/10737492.html
Copyright © 2011-2022 走看看