TCP 协议简介

就算我睁大眼睛,我也什么都看不到! –北野武 座头市

传输控制协议(TCP,Transmission Cntrol Protocal),提高可靠的、端到端的、面相字节省的有衔接传输协议。

面向有衔接是指在传送数据之前必须先树立衔接,数据传送完结后要开释衔接;面相字节省是端到端之间不保存音讯鸿沟,例如,将 4 个 512 字节写在一个 TCP 流中,那么这些数据有或许按照4 个 512 字节、2 个 1024 字节、1 个 2048 字节或者其他方式被递交给进程,接纳端是不知道这些数据被写入字节省时的单元巨细,所以 TCP 不了解也不关心字节省的意义,一个字节便是一个字节

任何 TCP发送数据之前, 都必须树立一条联通两头的衔接。在TCP/IP协议中,TCP协议供给可靠的衔接服务,衔接是经过三次握手进行初始化的。
一起因为TCP协议是一种面向衔接的、可靠的、基于字节省的运送层通信协议,TCP是全双工形式,所以需求四次挥手封闭衔接。

TCP 服务由发送端的接纳端创立一种套接字(socket)的端点来取得的,每个 socket 有一个socket 编号,由主机的 IP 和 16 位的端口组成,1024 以下的端口被保存只能由特权用户启动的标准服务,这些端口成为闻名端口(well-know port)。可以在www.iana.org查询一切闻名端口的列表,常见列表如下:

端口 协议 用处
20,21 FTP 文件传输
22 SSH 长途登录,Talent 的替代品
25 SMTP 电子邮件
80 HTTP 万维网
110 POP-3 访问长途邮件
143 IMAP 访问长途邮件
443 HTTPS 安全的 Web(SSL\TLS 之上的 HTTP)
543 RTSP 媒体播放控制
631 IPP 打印同享

TCP 段的头

TCP三次握手四次挥手详解

下面是对于 TCP 头的一些解释:

  1. 源端口号,16位,发送方的端口号。
  2. 方针端口号,16位,发送方的方针端口号。
  3. 32为序列号,sequence number,字节省的序号,确保网络传输数据的次序性。
  4. 32位承认号,acknowledgment number,用来承认确实有收到相关封包,内容表明希望收到下一个报文的序列号,用来解决丢包的问题,他是累计承认的。
  5. 头部巨细,4位,偏移量:最大值为0x0F,即15;指明晰包括多少个 32 位的字 ,单位为32位(bit),单位也便是4个字节,给出头部占32bit的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60(15*4)字节的TCP头部。
  6. Reserved 4位 ,预留字段,都为0
  7. TCP标志位
    1. CWR:Congestion window reduced,拥塞窗口削减。拥塞窗口削减标志被发送主机设置,用来标明它接纳到了设置ECE标志的TCP包。拥塞窗口是被TCP保护的一个内部变量,用来办理发送窗口巨细。
    2. ECN-Echo:显式拥塞提醒回应。当一个IP包的ECN域被路由器设置为11时,接纳端而非发送端被告知路径上发生了拥塞。ECN运用TCP头部来奉告发送端网络正在阅历拥塞,而且奉告接纳端发送段现已受到了接纳端发来的拥塞布告,现已降低了发送速率。
    3. URG:紧迫标志位,表明数据包的紧迫指针域有用,用来确保衔接不被阻断,并督促中间设备赶快处理;为1时,紧迫指针(urgent pointer)有用,配合紧迫指针运用
    4. ACK:承认标志位,对已接纳的数据包进行承认,为1时,承认号有用
    5. PSH: 推送标志位,表明该数据包被对方接纳后应立即交给上层运用,而不在缓冲区排队;为1时,接纳方应该赶快将这个报文段交给运用层
    6. RST:重置标志位,用于衔接复位、回绝过错和不合法的数据包,为1时,开释衔接,重连。
    7. SYN:同步标志位,用于树立会话衔接,同步序列号,为1时,建议一个衔接。
    8. FIN:完结标志位,表明我现已没有数据要发送了,即将封闭衔接,为1时,封闭一个衔接。
  1. 16位窗口巨细:占16bit。此字段用来进行流量控制,主要用于解决流控拥塞的问题。单位为字节数,这个值是本机希望一次接纳的字节数。
  2. 16位校验值: 占16bit。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由方针端进行验证。
  3. 16位紧迫指针:占16bit。它是一个偏移量,和序号字段中的值相加表明紧迫数据最终一个字节的序号。
  4. 32位Tcp选项:一般包括在三次握手中,必须是 32 位的倍数。

TCP数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范具体界说。在数据包的首部,明确标明晰协议应该如何读取数据。反过来说,看到首部,也就可以了解该协议必要的信息以及所要处理的数据。

TCP三次握手四次挥手详解

TCP 衔接树立

为什么需求三次握手?

TCP需求三次握手是为了树立可靠的衔接。当客户端想要和服务器树立衔接时,它会发送一个SYN(同步)报文段给服务器,告知服务器它想要树立衔接。服务器收到客户端的SYN报文段后,会回复一个SYN/ACK(同步/承认)报文段给客户端,告知客户端它现已收到了恳求,并准备好树立衔接。最终,客户端会发送一个ACK(承认)报文段给服务器,告知服务器它现已收到了服务器的回复,衔接树立成功。

这个进程需求三次握手是为了确保衔接的可靠性。假如只有两次握手,那么就无法确定客户端是否现已收到了服务器的回复。例如,在第2次握手后,服务器或许会因为网络故障或其他原因没有收到客户端的回复,此刻服务器会以为衔接现已树立成功。可是客户端并没有收到服务器的回复,此刻客户端会以为衔接没有树立成功。假如客户端持续发送数据,那么服务器就会以为这是一条无效的衔接,并回绝接纳数据。

这个进程需求三次握手是因为在网络中,每个报文段都或许会丢掉、推迟或重复。假如只有两次握手,那么客户端发送的SYN报文段或许会丢掉,而服务器不知道客户端想要树立衔接。假如有第三次握手,那么客户端会在第三个报文段中承认服务器的回复,然后确保衔接树立成功。

TCP 运用三次握手来树立衔接,树立一个 TCP 衔接时,需求客户端和服务器总共发送3个报文。

首要,某一端,譬如服务器必须先履行 LISTEN 和 ACCEPT 原语,然后被迫等候衔接恳求,此刻可以指定只有一个衔接恳求,也可以不指定。

其次,另一段(譬如客户端)履行 CONNECT原语,一起阐明他希望衔接的 IP 和端口号,愿意承受的最大 TCP 段长,以及一些其他参数,开端三次握手,握手示意图如下:

TCP三次握手四次挥手详解

以客户端和服务端通信为例:

第一次握手:

TCP报文标志位SYN置为1,发生随机序号值seq=x,保存在TCP首部的序列号(Sequence Number)字段里,指明客户端计划衔接的服务器的端口,并将该数据包发送给服务器端,发送结束后,客户端进入SYN_SENT状况,等候承认。

第2次握手:

服务器端由SYN=1知道客户端恳求树立衔接,服务器端将TCP报文标志位SYN和ACK都置为1,ack(也便是 ack_seq,ack 的值位上一次报文的序列号 seq+1)=x+1,随机发生一个序号值seq=y,并将该数据包发送给客户端以承认衔接恳求,服务器端进入SYN_RCVD状况。

第三次握手:

客户端收到承认后,查看ack是否为x+1,ACK是否为1,假如正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给服务器端,服务器端查看ack是否为y+1,ACK是否为1,假如正确则衔接树立成功,客户端和服务器端进入ESTABLISHED状况,完结三次握手,随后客户端与服务器端之间可以开端传输数据了。

留意:小写的ack代表的是头部的承认号Acknowledge number,是对上一个包的序号进行承认的号,ack=seq+1。

大写的ACK,是TCP首部中的和 SYN 相同的标志位,用于标志的TCP包是否对上一个包进行了承认操作,假如承认了,则把ACK标志位设置成1。

TCP断开衔接

为什么需求四次挥手

TCP衔接是全双工的,可是为例方便了解,咱们可以把他幻想成是一对单工衔接,每个单工衔接互相独立开释,也便是说,每个方向都可以去发送 FIN 的 TCP 标志位,这表明他现已没有数据需求发送了,当另一个方向承认后,这个方向上的衔接就被封闭了,不再发送任何数据。留意, 当一个方向上的数据被封闭后,另一个方向上或许还存在着无线的数据流,当两个方向上都被封闭后,衔接才算彻底开释。

通常情况下,开释一个链接需求四个TCP端:每个方向上一个FIN和一个ACK,然而,第一个ACK和第二个FIN有或许被组合到同一个段中,然后将所需求的段降低到三个

四次挥手

TCP三次握手四次挥手详解

咱们这儿以客户端建议挥手为例,实践也或许是服务端等建议

第一次挥手:

客户端建议挥手恳求,此刻客户端(建议端)现已没有数据需求发送给服务端了(服务端或许还在发送数据),向服务端发送标志位是FIN=1报文段,设置随机序列号seq=u,此刻,客户端进入FIN_WAIT_1等候状况。

第2次挥手:

服务端收到了客户端发送的FIN报文段,向客户端返回一个标志位是ACK的报文段,b表达承受到了并返回承认,ack=seq+1,客户端进入FIN_WAIT_2状况,服务端告知客户端,我承认并同意你的封闭恳求。

第三次挥手:

服务端向客户端发送标志位是FIN的报文段,恳求封闭衔接,一起服务端进入LAST_ACK状况。

第四次挥手:

客户端收到服务端发送的FIN报文段,向服务端发送标志位是ACK的报文段,然后客户端进入TIME_WAIT状况。服务端收到客户端的ACK报文段今后,就封闭衔接。此刻,客户端等候2MSL的时刻后仍然没有收到回复,则证明服务端已正常封闭,那好,客户端也可以封闭衔接了。

一个TCP衔接的两头也或许会一起发送FIN段,这两个段按常规方法被单独承认,然后封闭衔接,实践上,两台主机可以先后开释衔接或一起开释衔接,这两者之间并无本质区别。

一起,假如在两倍的最大数据包生存期。针对FIN的呼应没有出现,将直接开释衔接

为什么要等候2MSL(两倍的最大数据包生存期)?

MSL:报文段最大生存时刻,它是任何报文段被丢掉前在网络内的最长时刻。
有以下两个原因:

  • 第一点:确保TCP协议的全双工衔接可以可靠封闭
    因为IP协议的不可靠性或者是其它网络原因,导致了服务端没有收到客户端的ACK报文,那么服务端就会在超时之后从头发送FIN,假如此刻客户端的衔接现已封闭处于CLOESD状况,那么重发的FIN就找不到对应的衔接了,然后导致衔接紊乱,所以,客户端发送完最终的ACK不能直接进入CLOSED状况,而要保持TIME_WAIT,当再次收到FIN的收,可以确保对方收到ACK,最终正确封闭衔接。
  • 第二点:确保这次衔接的重复数据段从网络中消失
    假如客户端发送最终的ACK直接进入CLOSED状况,然后又再向服务端建议一个新衔接,这时不能确保新衔接的与刚封闭的衔接的端口号是不同的,也便是新衔接和老衔接的端口号或许相同了,那么就或许出现问题:假如前一次的衔接某些数据停留在网络中,这些推迟数据在树立新衔接后到达客户端,因为新老衔接的端口号和IP都相同,TCP协议就以为推迟数据是属于新衔接的,新衔接就会接纳到脏数据,这样就会导致数据包混乱。所以TCP衔接需求在TIME_WAIT状况等候2倍MSL,才能确保本次衔接的一切数据在网络中消失。

TCP衔接办理模型

TCP三次握手四次挥手详解

参阅链接

/post/684490…

www.cnblogs.com/bruce1992/p…

计算机网络[第五版]