# http三次握手

4 min read
Table of Contents

名词

序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。

确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。

控制位:

  • ACK:该位为1时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的SYN包之外该位必须设置为1
  • RST:该位为1时,表示 TCP 连接中出现异常必须强制断开连接。
  • SYN:该位为1时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
  • FIN:该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位为 1 的 TCP 段。

tcp工作在哪一层?

ip协议在网络层,tcp在传输层

什么是tcp?

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议

tcp三次握手

开始

客户端状态:CLOSE 服务端状态:CLOSE 服务端会监听某个端口处于LISTEM状态

客户端发送第一个报文

初始化序号client_isn 将syn标志为1,将syn发送给服务端 报文:syn+client_isn(客户端初始化的序列号) 客户端状态:syn-sent

服务端收到syn,发送第二个报文

服务端收到syn报文后,也初始化自己的序列号server_isn,将tcp首部的确认应答号(也就是客户端发送过来的序列号)填入client_isn+1,将syn和ack标志为1,发送给客户端 报文:syn+ack+(client_isn+1)+server_isn(服务端的序列号) 服务端状态:syn-rcvd

客户端发送第三个报文

客户端收到后,返回ack确认应答,客户端状态,服务端收到应答后也改变状态, 客户端发送报文:ack+(server_isn+1) 客户端状态:ESTABLEISHED 服务端状态:ESTABLEISHED

为什么是三次握手?不是两次、四次?

三次握手的原因:

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
  • 三次握手才可以同步双方的初始序列号
  • 三次握手才可以避免资源浪费

为什么不是两次? 不能阻止历史连接,在两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费

为什么不是四次? 可以四次,但没必要

My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts

Comments