• TCP协议三次握手


    TCP(Transmission Control Protocol) 传输控制协议

    TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

    位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)

    Sequence number(顺序号码) Acknowledge number(确认号码)

    第一次握手:

      主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

    第二次握手:

      主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

    第三次握手:

      主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

    完成三次握手,主机A与主机B开始传送数据

     

     

    具体如下:
    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据.

    实例1:

    IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
    IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
    IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1

    第一次握手:

      192.168.1.116发送位码syn=1,随机产生seq number=3626544836的数据包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;

    第二次握手:

      192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送ack number=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;

    第三次握手:

      192.168.1.116收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,192.168.1.116会再发送ack number=1739326487,ack=1,192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。

    实例2(sniffer截获的TCP包):

    如第一行,为第一步握手,主机(192.168.1.5)发送一个SYN为1的请求包,在这个时候会随机的生成一个SEQ(213162710)的序号,并等待远程主机(SZHXY.GUET.EDU.CN)回应;之后如第五行(阴影部分),远程主机(SZHXY.GUET.EDU.CN)收到SYN为1的请求包后,表示同意请求(既然是请求那么SYN必为1),那么就发送一个ACK=SEQ+1(213162711)的包,表示已经收到(192.168.1.5)的包,希望它发送下一个包,也就是SEQ+1的意思,同时自己也产生一个随机的序号seq(994767769为了区分上个SEQ故用小写表示,注意这个是远程主机产生的,与192.168.1.5没有关系),回应给(192.168.1.5);最后,也就是第三次握手,192.168.1.5最后发一个包,这个包主要是确定远程主机(SZHXY.GUET.EDU.CN)发的第一个包已经收到,所以SYN=0,ACK=seq+1(994767770),如第六行。

    到此三步握手完毕,为什么要产生SEQ呢?这也就是三步之后要做的事情,怎么说呢,TCP包是运输数据的,数据有长又短,数据超过了一个包所能运输的时候就要分几次运输,众所周知网络存在着延迟,原本按理说应该按顺序到达这样方便组织,打个比方,一个卡车运一批货物,但是这批货物太多,运不完要3架车来运,人们都会认为现到目的地的是先开的,但是由于公路机某些意外,第一架车在后面了,人们就无法知道谁第一个开车的,这时候就需要在车厢标号,如1,2,3;这样不管发生什么状况都能分辨出来了,序号的作用也如此。当然,这只是简单的模式,复杂的还要涉及数据包分片和偏移。

     
     

    详细请参考:http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415.html

  • 相关阅读:
    利用if else判断几点是什么时间段
    【UML】活动图介绍
    【UML】类图介绍
    jQuery Ajax跨域问题简易解决方案
    ASP.NET MVC @Html.Label的问题
    Mysql Show ProcessList命令
    【ASP.NET MVC 学习笔记】- 20 ASP.NET Web API
    【ASP.NET MVC 学习笔记】- 19 REST和RESTful Web API
    【ASP.NET MVC 学习笔记】- 18 Bundle(捆绑)
    【ASP.NET MVC 学习笔记】- 17 Model验证
  • 原文地址:https://www.cnblogs.com/StupidsCat/p/2664976.html
Copyright © 2020-2023  润新知