TCP网络协议

TCP全称为“传输控制协议”。TCP是面向连接,保证可靠性,面向字节流的一种网络传输协议。

TCP协议段格式
TCP网络协议_第1张图片

1.源 / 目的 端口号: 表示数据是从哪个进程来,到哪个进程去。
2.32位序号与确认序号: TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收。
3.4位TCP报头长度: 表示该TCP头部有多少个32bit(有多少个4字节);所以TCP头部最大长度是15* 4=60。
4.6位标志位:
(1)URG:紧急指针是否有效。
(2)ACK: 确认号是否有效。
(3)PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走。
(4)RST: 对方要求重新建立连接;我们把携带RST标识的称为复位报文段 (关闭当前连接,重新建立连接)。
(5)SYN: 请求建立连接;我们把携带SYN标识的称为同步报文段。
(6)FIN:通知对方,本端要关闭了,我们称携带FIN标识的结束报文段。
5.16位窗口大小: 接收方的缓冲区大小。
6.16位校验和: 发送端填充,CRC校验,接收端校验不通过,则认为数据有问题,此处的检验和不光包含TCP首部,也包含TCP数据部分。
7.16位紧急指针: 标识哪部分数据是紧急数据。
8.40字节头部选项: TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。

二、TCP连接管理机制

在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接。
TCP网络协议_第2张图片
三次握手建立连接:
第一次:发起方发送SYN,请求建立连接
第二次:接收方发送SYN请求建立连接,并发送ACK确认连接
第三次:发起方发送ACK确认连接。

注意:
(1)为什么不是两次握手: 发送信号时,最后一次信号有可能会丢失,如果是两次握手时,第二次发送的信号丢失,这时,服务器认为连接成功,而客户端因为未收到确认信号以为连接未建立,此时客户端再次发送SYN建立连接,这样会造成客户端一直建立连接,而服务器要分出一大部分资源来管理哪些无效的连接,有可能导致服务器崩溃。
(2)为什么是三次握手: 发送信号时,最后一次信号有可能会丢失,如果是三次握手,则服务器未接收到客户端的确认信号认为建立连接失败,而客户端因为在第二次握手时收到了确认信号,则认为连接成功,接下来客户端向服务器发送信息,发现不能发送,那么重新申请建立连接。这样不会影响服务器。
(3)为什么不是四次握手: 1>当三次握手后,A和B就已经可以确认双方能够正常通信了,再多一两次握手已经多余。
2> 换一种思路,第四次握手的目的与第二次握手的目的一样,既然没法确认第二次握手,A是否可以收到,那如何进行第三次握手,显然是无法进行第三次握手的。
注:在网络中,万全可靠的通信协议是根本不存在的,我们任何的通信协议都是在接受这样的现实情况之上进行的。协议可以确认之前的通信情况,但是无法确认之后的情况的。

四次挥手断开连接:
TCP网络协议_第3张图片

第一次:关闭连接的一方A, A向B发送FIN信号,通知B本端要关闭了,B收到信号进入CLOSE_WAIT状态。
第二次:B向A发送ACK确认信号。
第三次:B向A发送FIN信号通知A,B端就要关闭了,A收到信号进入TIME_WAIT状态(A端要等待一个2MSL的时间才会进入CLOSED状态)。
第四次:A端向B端发送ACK确认信号,A端收到后进入CLOSED状态。

注意:MSL代表的是报文最大生存时间,A端收到FIN后不是直接进入CLOSED状态,而是进入TIME_WAIT状态等待2MSL,因为最后一次的ACK信号有可能丢失,那么B端发现在一段时间后没有收到ACK信号,那么B端就需要时间重新向A端发送FIN信号,A端接收到FIN信号后会重发ACK信号,以此来确认A端已经关闭,然后B端也进入CLOSED状态(关闭)。

你可能感兴趣的:(c语言,TCP协议,三次握手,四次挥手)