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

原文地址:https://www.cnblogs.com/shijingjing07/p/7860574.html