网络初探

作者: 聪莞 | 来源:发表于2019-03-21 17:15 被阅读18次

    TCP的三次握手和四次挥手

    三次握手

    字段 含义 (大写表示标志位,值为1或0 小写表示序号)
    • URG 紧急指针是否有效。为1,表示某一位需要被优先处理
    • ACK 确认号是否有效,一般置为1。
    • PSH 提示接收端应用程序立即从TCP缓冲区把数据读走。
    • RST 对方要求重新建立连接,复位。
    • SYN 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
    • FIN 希望断开连接。
    • seq 序列号 ,随机生成。
    • ack 确认号,随机生成 。

    盗用一张网上的图片


    image.png

    初始状态:客户端A和[服务器]B均处于CLOSED状态,然后服务器B创建socket,调用监听接口使得服务器处于LISTEN状态,等待客户端连接。
    第一次握手:A发送SYN=1、序列号 seq=x 的包请求建立连接,并进入SYN_SENT状态;
    第二次握手:B收到连接请求后,同意建立连接,向A发送确认数据,这时TCP头部中的SYN和ACK标识位值均为1,确认序号为ack=x+1,然后选定自己的初始序号seq=y(一般是随机的),确认消息发送后,B进入SYN_RCVD状态;
    第三次握手:A收到B的确认信息后,发送确认数据:ACK=1,确认序列号ack=y+1 ,自己的序列号在连接请求的序列号上加1,即seq=x+1,发送完毕后,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

    四次挥手

    image.png

    初始状态:客户端A和服务器B之间已经建立了TCP连接,并且数据发送完成,打算断开连接,此时客户端A和服务器B都可以发送断开请求,下面以A主动发起断开请求为例。
    第一次挥手:A发送FIN=1,seq = m请求断开连接,m为A前面正常发送数据最后一个字节序号+1得到的,消息发送后A进入FNI_WAIT_1状态;
    第二次挥手:B收到了A的断开请求,并且给A回复一条确认信息ACK=1,自己的序列号为seq=n,确认序列号ack=m+1,n为前面正常发送数据最后一个字节序号+1得到,然后进入CLOSE_WAIT状态,此时A——>B的连接就已经断开。此时,A就进入FIN-WAIT-2(终止等待2)状态,等待B发送连接释放报文(在这之前还需要接受B发送的最后的数据);
    第三次挥手:B给A发送完数据结束之后,给A发送确认关闭消息:ACK=1,FIN=1,确认序列号ack=m+1,自己的序列号为w,此时,B就进入了LAST-ACK(最后确认)状态,等待A的最后确认。
    第四次挥手:A收到B的消息后,发出确认 ACK=1,序列号为第一次挥手的序列号+1即:seq=m+1,确认序列号ack=w+1,此时,A就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后没有收到B的重传请求,则表明B收到了自己的确认,进入CLOSED状态。B只要收到了A发出的确认,立即进入CLOSED状态。这样,就结束了这次的TCP连接。

    可以看到,服务器结束TCP连接的时间要比客户端早一些。

    附件:

    OSI七层网络模型 (把 会话层+表示层+应用层 统称为应用层)

    image.png
    image.png

    相关文章

      网友评论

        本文标题:网络初探

        本文链接:https://www.haomeiwen.com/subject/ljwfvqtx.html