• TCP三次握手,四次分手


    1.什么是HTTP连接
    http是建立在TCP协议之上的一种应用。
    最显著的特点是每次请求,都需要服务器响应,请求结束后,会主动释放连接。
    1)在HTTP 1.0中,客户端的每次请求都要建立一次单独的连接,在处理完本次请求后,服务器会主动释放连接。
    2)在HTTP 1.1中,一次连接可以处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
    若服务器长时间没有收到客户端的请求,则认为客户端下线,服务器会主动释放连接。

    2.什么是socket
    套接字(socket)是TCP操作的单元,包含了通信双方的基本信息(连接使用的协议,本地主机的IP地址,端口,远地主机的IP地址,端口)
    多个TCP连接可能需要通过同一个TCP协议端口传输数据,scoket可以实现数据传输的并发服务。

    建立socket连接需要一对套接字,一个运行于客户端,一个运行于服务端。
    建立连接分为三个步骤:服务器监听,客户端请求,连接确认
    服务器监听:等待客户端的连接请求
    客户端请求:客户端向指定服务器发出连接请求
    连接确认:服务器端套接字监听到客户端套接字请求时,响应客户端请求,建立一个新的线程,把服务器端套接字的描述发给客户端,
    客户端确认此描述后,正式建立连接,服务端套接字继续监听其他客户端请求。

    socket支持多种传输层协议(TCP或UDP),当使用TCP协议连接时,该Socket连接就是一个TCP连接。
    TCP连接时,双方可以互发消息,都可以主动关闭连接。
    当使用HTTP协议时,在传输层使用的是TCP协议,但HTTP使用的是“请求-响应”模式,需要客户端发出请求,服务器才会主动响应。

    3.什么是TCP
    1)OSI七层模型

    2)TCP头部
    20字节的固定首部,加上不固定长度的选项(报文描述等),如下所示:

    Source Port源端口,Destination Port目的端口各占2个字节,端口号配上IP首部中的地址,即可确定一个TCP连接。

    Sequence Number序号,报文段中的第一个数据字节在数据流中的序号,用来解决报文乱序的问题。

    Acknowledgment Numer确认号,确认号为接收端收到的序列号,加1,主要用来解决不丢包的问题

    Offset数据偏移,值是由不固定长度的选项决定的

    TCP Flags标志位,控制TCP的状态,URG,ACK,PSH,RST,SYN,FIN

    Window窗口大小,滑动窗口(待研究)

    检验和,检查数据是否有误

    紧急指针,URG=1时,该字段有效,指出的是紧急数据在报文段中结束的位置

    3)TCP通信示意图

    4)三次握手
    第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x,然后客户端进入SYN_SEND状态,等待服务器的确认。

    第二次握手:服务器收到SYN报文段。服务器收到SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Numer为x+1,同时,自己还要发送SYN请求信息,将SYN置为1,Sequence Number为y,服务端将上述所有信息放到一个报文段(即SYN+ACK报文段),一并发送给客户端,此时服务器进入SYN_RECV状态。

    第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Numer为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

    5)四次分手
    第一次分手:主机1(可以是客户端,也可以是服务器端)设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文,此时主机1进入FIN_WAIT_1状态,表示主机1没有数据要发送个主机2了。

    第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number+1,主机1进入FIN_WAIT_2状态,主机2告诉主机1,我同意你的关闭请求,主机2进入CLOSE_WAIT状态。

    第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态。

    第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态,主机2收到主机1的ACK报文段以后,就关闭连接,此时,主机1等到2MSL后,依然没收到回复,则证明Server端已正常关闭,然后主机1也可以关闭连接了。

    6)为什么要三次握手
    如果连接已关闭,此时由于网络延迟等原因造成的重复分组到达时,服务端会认为客户端再次发出了连接请求,服务端发送ACK确认,如果不使用三次握手,此时连接会重新建立,并一直等待客户端发送数据,这种情况,服务端资源就白白浪费掉了,而使用三次握手,客户端这种情况是不会向服务端的确认发出确认的,服务端由于收不到确认,就知道客户端并没有要求建立连接。

    7)为什么要四次分手
    TCP是面向连接,可靠的,基于字节流的运输层通信协议。是全双工的模式,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了,但是,这个时候主机1还是可以接受来自主机2的数据,当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的,当主机2也发送了FIN报文段时,这个时候表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,主机1发送ACK确认报文段,主机2收到该报文段,关闭连接,主机1等待2MSL后关闭。

    8)四次分手最后一次为什么要等待2MSL
    主机1发送ACK确认报文段后,并不知道主机2有没有收到确认报文段,如果没有收到,超过1MSL,主机2会重发一次FIN请求,如果在2MSL时间,主机1没有收到重发的请求,说明主机2已经成功接收ACK确认报文并关闭,这是主机1也可以安心关闭了。

    参考:https://github.com/jawil/blog/issues/14

  • 相关阅读:
    这是在CNblogs倒闭前,本blog最后一篇随笔,请各位看官好好珍惜,主题:改变Docker Port 2376从你我做起,有图为证
    娱乐往事,年初捡到1G PAR,平淡的日子泛起波澜(小编,今天你移了多少次了?给一个说法吧,置顶了)
    DOCKER绝对领域从2048到4069?不:25519,数字的飞跃,HTTP/2
    再次聚焦DOCKER MACHINE CODE 2048
    视觉光盘,只有我可以贴全世界唯一,Windows上最高级的DOCKER客户端数字, 夜晚点击一个都没有,值班的小编辛苦了
    视觉光盘,只有我可以贴全世界唯一,你永远截不到的图片(小编请用人性化语言解释移出首页)
    深夜话题boot2docker还有那些隐藏MENU
    Go Goosy Disk Docker Port Provisioners (GDP)
    揭发233的docker/machine
    手动滑稽之golang-vmware-driver广告篇
  • 原文地址:https://www.cnblogs.com/shijingjing07/p/7860574.html
Copyright © 2020-2023  润新知