分别占用16位,表示源端口号和目的端口号,用于区别主机中的不一样进程, 而IP地址是用来区分不一样的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能惟一 的肯定一个TCP链接。编程
用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据 字节在数据流中的序号;主要用来解决网络报文乱序的问题。安全
32位确认序列号包含发送确认的一端所指望收到的下一个序号,所以,确认序号应 当是上次已成功收到数据字节序号加1。不过,只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字 段才有效。主要用来解决不丢包的问题。服务器
给出首部中32 bit字的数目,须要这个值是由于任选字段的长度是可变的。这个字段占4bit(最多能 表示15个32bit的的字,即4*15=60个字节的首部长度),所以TCP最多有60字节的首部。然而,没有任选字段, 正常的长度是20字节。cookie
TCP首部中有6个标志比特,它们中的多个可同时被设置为1,主要是用于操控TCP的状态机的,依次 为URG,ACK,PSH,RST,SYN,FIN。每一个标志位的意思以下:网络
URG:此标志表示TCP包的紧急指针域(后面立刻就要说到)有效,用来保证TCP链接不被中断,而且督促 中间层设备要尽快处理这些数据。并发
ACK 此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中;有两个取值:0和1, 为1的时候表示应答域有效,反之为0。socket
PSH:这个标志位表示Push操做。所谓Push操做就是指在数据包到达接收端之后,当即传送给应用程序, 而不是在缓冲区中排队。tcp
RST:这个标志表示链接复位请求。用来复位那些产生错误的链接,也被用来拒绝错误和非法的数据包。线程
SYN:表示同步序号,用来创建链接。SYN标志位和ACK标志位搭配使用,当链接请求的时候,SYN=1, ACK=0;链接被响应的时候,SYN=1,ACK=1;这个标志的数据包常常被用来进行端口扫描。扫描者发送 一个只有SYN的数据包,若是对方主机响应了一个数据包回来 ,就代表这台主机存在这个端口;可是因为这 种扫描方式只是进行TCP三次握手的第一次握手,所以这种扫描的成功表示被扫描的机器不很安全,一台安全 的主机将会强制要求一个链接严格的进行TCP的三次握手。3d
FIN:表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据能够传送了,发送FIN标志 位的TCP数据包后,链接将被断开。这个标志的数据包也常常被用于进行端口扫描。
滑动窗口大小 (流量控制)。
奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另外一端发送紧急数据的一种方式。
最多见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每一个链接方一般都在通讯的第一个报文段(为创建链接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不必定是32位的整数倍,因此要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
TCP 报文段中的数据部分是可选的。在一个链接创建和一个链接终止时,双方交换的报文段仅有 TCP 首部。若是一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多状况中,也会发送不带任何数据的报文段。
为何须要三次握手:
所谓三次握手是指创建一个 TCP 链接时须要客户端和服务器端总共发送三个包以确认链接的创建。在socket编程中,这一过程由客户端执行connect来触发。
在 Server 收到 Client 的 SYN 以后,回复 SYN-ACK 的时候未收到 ACK 确认,致使服务端不断重试,直到超时。
恶意程序会在短期对服务器不断发起创建链接请求,但不响应服务器请求,致使服务器不断重发,占用资源,致使崩溃。
向 Client 发送探测报文,若是未收到响应则继续发送,直到收到响应或达到保活探测数时,中断链接。
因为TCP链接是全双工的,所以,每一个方向都必需要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的链接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,可是在这个TCP链接上仍然可以发送数据,直到这一方向也发送了FIN。
四次挥手即终止TCP链接,就是指断开一个TCP链接时,须要客户端和服务端总共发送4个包以确认链接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
客户端关闭 socket 链接,服务端忙于处理读或写,没有及时关闭链接
发送数据包到收到对应的 ACK,中间所花费的时间
重传时间间隔(通过 RTT 计算获得)
TCP 使用滑动窗口作流量控制和乱序重排