Http协议3次握手,4次挥手


Http协议3次握手,4次挥手

1、TCP传输控制协议:

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

位码(即tcp)标志位,有6种标识

①SYN(synchronous建立联机)

②ACK(acknowledgment确认)

③PSH(push传送)

④FIN(finish结束)

⑤RST(reset重置)

⑥URG(urgent紧急)

  Sequent number:顺序号码

  Acknowledge number:确认号码

SYN:代表请求创建连接,所以在三次握手中前两次要SYN=1,表示这两次用于建立连接。
FIN:表示请求关闭连接,在四次分手时,我们发现FIN发了两遍。这是因为TCP的连接是双向的,所以一次FIN只能关闭一个方向。
ACK:代表确认接受,从上面可以发现,不管是三次握手还是四次分手,在回应的时候都会加上ACK=1,表示消息接收到了,并且在建立连接以后的发送数据时,都需加上ACK=1,来表示数据接收成功。
seq:序列号,什么意思呢?当发送一个数据时,数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。
初始序列号是随机生成的,这样不一样的数据拆包解包就不会连接错了。(例如:两个数据都被拆成1,2,3和一个数据是1,2,3一个是101,102,103,很明显后者不会连接错误)
ack:这个代表下一个数据包的编号,这也就是为什么第二请求时,ack是seq+1。

2、握手过程:

  第一次:主机A发送位码为syn = 1,随机产生Seq number = 1234567的数据包到服务器,主机B由于SYN = 1知道主机A要求建立联机。—— A机请求连接包到B机(随机产生Seq number = 1234567, SYN = 1)。
  第二次:主机B收到请求后要确认联机信息,向主机A发送ack number = (主机A的Seq number + 1),syn = 1,ack = 1和(随机产生seq number = 7654321)—— B机回应A机请求,syn = 1,ack = 1和(随机产生seq number = 7654321)的包。
  第三次:主机A收到后检查ack number是否正确,即第一次发送的seq number + 1, 以及位码是ack是否为1,若正确,主机A会再发送ack number = (主机B的seq + 1), ack = 1,主机B收到后确认seq number值和ack = 1则连接成功。

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

3、在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。——每次请求服务器都会3次握手,4次挥手

1.客户端首先要SYN=1,表示要创建连接,
2.服务端接收到后,要告诉客户端:我接受到了!所以加个ACK=1,就变成了ACK=1,SYN=1
3.理论上这时就创建连接成功了,但是要防止可能出现的问题,所以客户端要再发一个消息给服务端确认一下,这时只需要ACK=1就行了
可能出现的问题:如果一个连接请求在网络中跑的慢,超时了,这时客户端会从发请求,但是这个跑的慢的请求最后还是跑到了,然后服务端就接收了两个连接请求,然后全部回应就会创建两个连接,浪费资源!如果加了第三次客户端确认,客户端在接受到一个服务端连接确认请求后,后面再接收到的连接确认请求就可以抛弃不管了。

  第一次握手:建立连接时,客户端发送SYN包(SYN = 1, ACK = 0, seq = x)到服务器,并进入SYN_SEND状态,等待服务器确认。
  第二次握手:服务器收到syn包,必须确认客户端的SYN (SYN = 1, ACK = 1, seq = y, sck = x + 1),同时自己也发送一个SYN包(syn = k),即SYN + ACK包给客户端,此时服务器进入SYN_RECV状态。
  第三次握手:客户端收到服务器的SYN + ACK包,向服务器发送确认包ACK(ACK = 1, seq = x + 1, ack = y + 1),此包发送完毕,客户端和服务器进入RSTABLISHEN状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

4、4次挥手(关闭连接)

  由于TCP连接是全双工的,因此每个方向都必须单独进行关闭,这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
  TCP的连接的拆除需要发送四个包,因此称为四次挥手。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手动作。

1)四次挥手:

1、客户端A发送一个FIN(FIN = 1, seq = u),用来关闭客户端A到服务器B的数据传送。
2、服务器B收到这个FIN(FIN = 1, seq = u),它发回一个ACK(ACK = 1, seq = v, ack = u + 1)确认序号为收到的序号加1 ,一个FIN将占用一个序号。
3、服务器B关闭与客户端A的连接,发送一个FIN(FIN = 1, seq = w, ack = u + 1)给客户端A。
4、客户端A发回ACK(ACK = 1, seq = u + 1, ack = w + 1)报文确认,并将确认序号设置为收到序号加1。

2)四个挥手的深入理解:

TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。简单说是“先关读,后关写”,一共需要四个阶段。

以客户端发起关闭连接为例:

1、服务器读通道关闭。
2、客户端写通道关闭。
3、客户端读通道关闭。
4、服务器写通道关闭。

  关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段。直到接收到对方发送的FIN,且对方收到了接收确认ACK之后,双方的数据通信完全结束,过程中每次接收都需要返回确认数据段ACK
  这是标准的TCP关闭两个阶段,服务器和客户端都可以发起关闭,完全对称。

5、TCP/UDP区别:

TCP传输控制协议:

  面向连接、传输可靠(保证数据正确性)、有序(保证数据顺序)、传输大量数据(流模式)、速度慢、对系统资源的要求多、程序结构较为复杂、每一条TCP连接只能是点到点的,TCP首部开销20字节

  流模式:当通过TCP连接给另一端发送数据,只要调用一次write,发送了100个字节,但接受方可以分10次收完,每次10个字节;也可以调用10次wrtie,每次10个字节,但接受方可以一次收完。
Ps:  但是,发送的数据量不能大于对方的接受缓存(流量控制),如果硬要发送过量数据,则接收方的缓存满了就会把多出的数据丢失。这种情况是设置非阻塞I/O模型,会把内存耗尽,因为socket是存在内核中的。

UDP用户数据报协议:

  面向非连接、传输不可靠(可能丢包)、无序、传输少量数据(数据报模式)、速度快、对系统资源的要求少、程序结构较为简单、UDP支持一对一、一对多、多对一和多对多的交互通信,UDP的首部开销小(只有8个字节)。

  数据报模式:发送端调用了几次write,接收端必须用相同的次数的read读完。UDP是基于报文的,在接受的时候,每次最多只能读取一个报文,报文和报文不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。也就是,如果不指定MSG_PEEK标志,每次读取操作会消耗一个报文。

6、WebSocket——解决了服务器与客户端全双工通信的问题

1)、什么是单工、半双工、全双工通信?

  单工:信息只能单向传输。
  半双工:信息能双向传送但不能同时双向传送。
  全双工:信息能够同时双向传送。

  WebSocket协议包含两部分:一部分是"握手",一部分是"数据传输"。

2)、WebSocket和Socket的区别:

  1、Socket不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。
  2、当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。TCP连接则更依靠于底层的IP协议,IP协议的连接则依赖于链路层更低层次。
  3、Socket是传输控制层协议,WebSocket是应用层协议。

7、WebSocket与http协议:

1)、http:

  http协议是非持久化的,单向的网络协议,在建立连接后只允许浏览器向服务器发出请求后,服务器才能返回相应的数据。当需要即时通讯时,通过轮询方式(即在特定的时间间隔不断请求服务器,如1秒),由浏览器向服务器发送Request请求,然后将最新的数据返回给浏览器。
缺点:会导致过多不必要的请求,浪费流量和服务器资源,没一次请求、应答,都浪费了一定的流量在相同的头部信息上。

2)、WebSocket:

  webSocket解决了http协议的缺点。在webSocket中只需要服务器和浏览器通过http协议进行一个握手的动作,然后单独建立一条TCP的通信通道进行数据的传送。

3)、webSocket与http相同点:

  1、都是一样基于TCP的,都是可靠性传输协议。
  2、都是应用层协议。

4)、webSocket与http不同点:

  1、webSocket是双向通信协议,模拟socket协议,可以双向发送或接受信息。http是单向的。
  2、webSocket是需要握手进行建立连接的。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM