TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。之后TCP把数据包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。
src port:源端口,2个字节,是一个大于1023的16位数字,由基于TCP应用程序的用户进程随机选择
dst port:目的端口,2个字节,指明接收者所用的端口号,一般由应用程序来指定
Sequence number:顺序号,4个字节,用来标识从 TCP 源端向 TCP 目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号。如果将字节流看作在两个应用程序间的单向流动,则 TCP 用顺序号对每个字节进行计数。序号是 32bit 的无符号数,序号到达 (2^32) - 1 后又从 0 开始。当建立一个新的连接时, SYN 标志变 1 ,顺序号字段包含由这个主机选择的该连接的初始顺序号 ISN ( Initial Sequence Number )
Acknowledgement number:确认号,4个字节,包含发送确认的一端所期望收到的下一个顺序号。因此,确认序号应当是上次已成功收到数据字节顺序号加 1 。只有 ACK 标志为 1 时确认序号字段才有效
Offset:报头长度,4位,给出报头中 32bit 字的数目。需要这个值是因为任选字段的长度是可变的。这个字段占 4bit , 即TCP 最多有 60(15*4) 字节的首部
Resrvd:保留区域,6位,保留给将来使用,目前必须置为 0
Control Flags(6位)控制位包括
URG:为 1 表示紧急指针有效,为 0 则忽略紧急指针值
ACK:为 1 表示确认号有效,为 0 表示报文中不包含确认信息,忽略确认号字段
PSH:为 1 表示是带有 PUSH 标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满
RST:用于复位由于主机崩溃或其他原因而出现错误的连接。它还可以用于拒绝非法的报文段和拒绝连接请求。一般情况下,如果收到一个 RST 为 1 的报文,那么一定发生了某些问题
SYN:同步序号,为 1 表示连接请求,用于建立连接和使顺序号同步( synchronize )
FIN:用于释放连接,为 1 表示发送方已经没有数据发送了,即关闭本方数据流
Window Size:窗口大小,2个字节,表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。窗口大小是一个 16bit 字段,因而窗口大小最大为 65535(2^16 - 1)
Checksum:校验和,2个字节,对整个的 TCP 报文段(包括 TCP 头部和 TCP 数据),以 16 位字进行计算所得。这是一个强制性的字段,要求由发送端计算和存储,并由接收端进行验证
Urgent Pointer:紧急指针,2个字节,是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。 只有当URG 标志置 1 时紧急指针才有效
Option and Pad:选项和填充,n*4字节,常见的可选字段是最长报文大小 MSS(Maximum Segment Size) 。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN 标志的那个段)中指明这个选项,它指明本端所能接收的最大长度的报文段。选项长度不一定是 32 位字的整数倍,所以要加填充位,使得报头长度成为整字数
Data:数据,不定长度,为上层协议封装好的数据
附三次握手(建立连接),四次挥手(释放连接)
握手:
1.客户端发送一个 SYN 报文段( SYN 为 1 )指明客户端打算连接的服务器的端口,以及初始顺序号( ISN ) (客户端----》服务端)
2.服务器发回包含服务器的初始顺序号( ISN )的 SYN 报文段( SYN 为 1 )作为应答。同时,将确认号设置为客户的 ISN 加 1 以对客户的 SYN 报文段进行确认( ACK 也为 1 )(服务端----》客户端)
3.客户端必须将确认号设置为服务器的 ISN 加 1 以对服务器的 SYN 报文段进行确认( ACK 为 1 ),该报文通知目的主机双方已完成连接建立(客户端----》服务端)
挥手:
1.客户端发送一个FIN(FIN为1),用来关闭客户端到服务器的数据传送 (客户端----》服务端)
2.服务器收到这个FIN,它发回一个ACK(ACK为1),确认序号为收到的序号加1 (服务端----》客户端)
3.服务器关闭与客户端的连接,发送一个FIN给客户端 (服务端----》客户端)
4.客户端发回ACK报文确认,并将确认序号设置为收到序号加1 (客户端----》服务端)
四次挥手的目的在于如果客户端因为数据发送完毕而想要关闭,便发送FIN。服务端收到FIN后,但可能还存在数据需要发给客户端,所以服务端先发ACK作为应答。当服务端也发送完毕之后,再发回FIN作为关闭连接。客户端收到FIN后,发送ACK,然后关闭连接。