三次握手

前提条件
客户端与服务端可以建立链接,但是客户端与服务端都有各自的进程,而且都可能需要建立tcp连接,如果有两个浏览器进程同时访问一个服务,服务器要将内容分发给两个不同的应用进程,宿主机就会将两个不同的浏览器加上端口号特定的进行传输,IP地址加上端口号就叫做套接字socket。

TCP三次握手
TCP报文里有SYN,ACK,FIN等标识,如果设置1就是开启这些表示,如果设置0就是关闭这些标识
  首先客户端向服务端发起请求的时候会将SYN开启(synchronization 同步),表示客户端想要与服务端建立同步。
在发送报文中包含一个重要字段为sequence序号(ps:为什么要包含这个字段因为应用程序可能连续发送多个序号给服务器,这样服务器会有依据判断哪些是累赘信息,sequence序号是随机生成的,作为初始值来进行后续判断依据,这样就更加保证了通道的唯一性)
  服务端接收到客户端发来的SYN之后,服务器会在TCP报文中把SYN和ACK(acknowlegdgment 确认)开启,服务器也会生成自己的序号,加上一个确认号,确认号是从客户端序号中+1得到的,这样客户端在收到号码后-1就知道是不是自己发送的TCP报文了
最后客户端进行确认,如果不确认服务器就不知道自己发出的“ACK+SYN”是否被接收,于是就需要再发送一次TCP报文来使连接正式建立。客户端将自己的ACK开启,这里的序号使用对方的确认号生成,并且在确认号上根据对方的序号+1(如果每一次发过来的SYN,服务器都需要记住其序号,并且新生成自己的需要记住的序号,那么服务器就需要挂起很多的资源,因此服务器干脆不保存自己的序号,而是根据服务器的IP地址和端口号等私有信息进行算法的运算得到序号)


交流建立完毕
握手后双方就建立连接,这个时候客户端就可以发送HTTP请求了,然后服务器相应内容


TCP四次挥手(假设客户端主动关闭请求)
这个时候客户端会在报文中开启FIN(finish 结束)和ACK两个控制位,并将自己的序号与确认号发送给服务端
服务端接收到后会返回ACK, 包含序号(客户端的确认号)与确认号+1(客户端的序号)
  最然发送了TCP报文,但此时客户端并未正式关闭通道,因为服务端那边可能还有需要发送的数据
等服务端发送完数据以后会再发送一个FIN+ACK来进行最后的确认,此时的序号与确认号不需要改变,因为没有一来一回,只是多了一个控制位FIN来进行确认结束步骤
最后客户端得到最终的结束确认以后会发送ACK来进行确认,此时自己的序号需要使用对方的确认号+1,确认号为对方的序号+1

 

posted @ 2021-11-26 09:52  愿祖国繁荣富强  阅读(61)  评论(0)    收藏  举报