TCP协议

  1. TCP是面向连接的、可靠的进程到进程通信的协议。
  2. TCP提供全双工服务,即数据可在同一时间双向传输。
  • TCP报文段: (1)TCP将若干个字节构成一个分组,叫报文段。 (2)TCP报文段封装在IP数据报中。 注:
  • 面向连接网络协议,是指通信双方之间在进行通信之前要先建立连接。比如打电话,双方通话前需要先建立连接。
  • 无连接网络协议,是指通信双方不需要事先建立一条通信线路,而是把每个带有目的地址的包送到网络线路上,由系统自主选定路线进行传输。比如QQ发送信息。

TCP报文段

  • TCP报文段:TCP将若干个字节构成一个分组,称为报文段;TCP报文段封装在IP数据报中。 Snipaste_20211011_200804.png
  1. ==源端口号==:发送方进程对应的端口号。
  2. ==目标端口号==:接收端进程的端口号。接收端收到数据段后,根据这个端口号来确定把数据送给哪个应用程序的进程。
  3. ==序号==:发送端将每个字节进行编号,便于接收方正确重组。
  4. ==确认号==:对发送方的确认消息。接收端响应消息的时候会用它来告诉发送端这个序号的数据段都已经收到,如果确认号是X,就是表示前X-1个数据段都已收到。
  5. ==首部长度==:用来表示TCP数据包头长度,一般20字节,但是首部长度最多可以扩大到60字节(根据选项来扩展)。
  6. ==保留==:作为扩展位,目前没有用到。
  7. ==控制位==:
  • URG: 紧急位。紧急指针有效位,配合紧急指针使用。
  • ACK: 确认位。当ACK=1时,确认序列号字段才有效,为0时,无效。
  • PSH: 急迫位。标志位为1时,要求接收方尽快将数据段送达应用层。
  • RST:重置位。当RST值为1时,通知重新建立TCP连接。
  • SYN:同步(连接)位。同步序号位,TCP需要建立连接时将这个值设为1。
  • FIN: 断开位。当TCP完成数据传输需要断开连接时,提出断开连接的一方将这个值设为1。
  1. ==窗口大小==:说明本地可接受数据段的数目。这个值的大小是可变的,当网络通畅时接收端响应消息会将这个窗口值变大以加快传输速度,当网络不稳定时减小这个值可保证网络数据的可靠传输,TCP中的流量控制就是依靠变化窗口大小来实现的。比如下载速度从一开始的几KB逐渐升到几MB的过程。控制网速用的。 9.==校验和==:用来做差错控制。字段检验的范围包括首部和数据这两部分。数据段在发送时和到达目的地时会进行校验和计算,若这两次的校验和一致,则说明数据基本是正确的,否则将认为该数据已被破坏,接收端将丢弃该数据。 10.==紧急指针==:和URG配合使用,当URG=1时有效。 11.==选项==:在TCP首部可以有多达40字节的可选信息。例如,最大报文段长度MSS(Maximum Segment Size)。MSS告诉对方TCP:我的缓存所能接收的报文段的数据字段最大是MSS个字节。

TCP3次握手

Snipaste_20211011_210436.png

  1. 第一次握手:客户端请求建立连接,向服务端发送一个同步报文(SYN=1),同时选择一个随机数 seq = x 作为初始序列号,并进入SYN_SENT状态,等待服务器确认。
  2. 第二次握手:服务端收到连接请求报文后,如果同意建立连接,则向客户端发送同步确认报文(SYN=1,ACK=1),确认号为 ack = x + 1,同时选择一个随机数 seq = y 作为初始序列号,此时服务器进入SYN_RCV状态。
  3. 第三次握手:客户端收到服务端的确认后,向服务端发送一个确认报文(ACK=1),确认号为 ack = y + 1,序列号为 seq = x + 1,客户端和服务器进入ESTABLISHED状态,完成三次握手。

TCP断开连接的4次挥手

Snipaste_20211011_211008.png

  1. 第一次挥手:客户端向服务端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待服务端的确认。 序列号 seq = u,即客户端上次发送的报文的最后一个字节的序号 + 1 确认号 ack = k, 即服务端上次发送的报文的最后一个字节的序号 + 1
  2. 第二次挥手:服务端收到连接释放报文后,立即发出确认报文(ACK=1),序列号 seq = k,确认号 ack = u + 1。 这时 TCP 连接处于半关闭状态,即客户端到服务端的连接已经释放了,但是服务端到客户端的连接还未释放。这表示客户端已经没有数据发送了,但是服务端可能还要给客户端发送数据。
  3. 第三次挥手:服务端向客户端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待 A 的确认。 序列号 seq = w,即服务端上次发送的报文的最后一个字节的序号 + 1。 确认号 ack = u + 1,与第二次挥手相同,因为这段时间客户端没有发送数据
  4. 第四次挥手:客户端收到服务端的连接释放报文后,立即发出确认报文(ACK=1),序列号 seq = u + 1,确认号为 ack = w + 1。 此时,客户端就进入了 TIME-WAIT 状态。注意此时客户端到 TCP 连接还没有释放,必须经过 2*MSL(最长报文段寿命)的时间后,才进入 CLOSED 状态。而服务端只要收到客户端发出的确认,就立即进入 CLOSED 状态。可以看到,服务端结束 TCP 连接的时间要比客户端早一些。 Snipaste_20211011_211412.png
  • TCP 一方(通常是客户端)可以终止发 送数据,但仍然可以接收数据,称为半关闭。具体如下。
  1. 客户端发送FIN报文段,半关闭了这个连接,服务器发送ACK报文段接受半关闭。
  2. 服务器继续发送数据,而客户端只发送ACK确认,不再发送任何数据。
  3. 当服务器已经把所有数据发送完毕时,就发送FIN报文段,客户再发送ACK报文段,这样就关闭了TCP连接。

UDP协议

  • UDP协议是无连接、不保证可靠性的传输层协议。发送端不关心发送的数据是否到达目标主机、数据是否出错等,收到数据的主机也不会告诉发送方是否收到了数据,它的可靠性由上层协议来保障。传输数据速度更快,效率更高。

UDP报文首部格式

源端口号(16) 目标端口号(16)
UDP长度(16) UDP校验和(16)
  • UDP长度:用来指出UDP的总长度,为首部加上数据。
  • 校验和:用来完成对UDP数据的差错检验,它是UDP协议提供的唯一可靠机制。

常见TCP/UDP端口号

  • TCP
端口 协议 说明
21 FTP 文件传输协议,FTP服务器所开放的控制端口
22 SSH 安全Shell服务
23 TELNET 用于 远程登陆,可以远程控制管理目标计算机
25 SMTP 简单邮件传输协议,SMTP服务器开放的端口,用于发送邮件
53 DNS 域名系统,建立连接,区域传送
80 HTTP 用于万维网服务的超文本传输协议
110 POP3 用于邮件的接受
443 HTTPS 安全超文本传输协议,用SSL/TLS对数据进行加密和解密,HTTP进行传输
  • UDP
端口 协议 说明
53 DNS 域名系统,DNS解析
69 TFTP 简单文件传输协议
111 RPC 远程过程调用
123 NTP 网络时间协议
161 SNMP 简单网络管理协议
  • 为什么需要三次握手,而不是两次? 答:
  1. 防止已过期的连接请求报文突然又传送到服务器,因而产生错误和资源浪费。 在双方两次握手即可建立连接的情况下,假设客户端发送 A 报文段请求建立连接,由于网络原因造成 A 暂时无法到达服务器,服务器接收不到请求报文段就不会返回确认报文段。客户端在长时间得不到应答的情况下重新发送请求报文段 B,这次 B 顺利到达服务器,服务器随即返回确认报文并进入 ESTABLISHED 状态,客户端在收到 确认报文后也进入 ESTABLISHED 状态,双方建立连接并传输数据,之后正常断开连接。此时姗姗来迟的 A 报文段才到达服务器,服务器随即返回确认报文并进入 ESTABLISHED 状态,但是已经进入 CLOSED 状态的客户端无法再接受确认报文段,更无法进入 ESTABLISHED 状态,这将导致服务器长时间单方面等待,造成资源浪费。 2.三次握手才能让双方均确认自己和对方的发送和接收能力都正常。 第一次握手:客户端只是发送处请求报文段,什么都无法确认,而服务器可以确认自己的接收能力和对方的发送能力正常; 第二次握手:客户端可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常; 第三次握手:服务器可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常; 可见三次握手才能让双方都确认自己和对方的发送和接收能力全部正常,这样就可以愉快地进行通信了。 3.告知对方自己的初始序号值,并确认收到对方的初始序号值。 TCP 实现了可靠的数据传输,原因之一就是 TCP 报文段中维护了序号字段和确认序号字段,通过这两个字段双方都可以知道在自己发出的数据中,哪些是已经被对方确认接收的。这两个字段的值会在初始序号值得基础递增,如果是两次握手,只有发起方的初始序号可以得到确认,而另一方的初始序号则得不到确认。
  • 为什么要三次握手,而不是四次? 答:
  1. 第一次握手:服务端确认“自己收、客户端发”报文功能正常。
  2. 第二次握手:客户端确认“自己发、自己收、服务端收、客户端发”报文功能正常,客户端认为连接已建立。
  3. 第三次握手:服务端确认“自己发、客户端收”报文功能正常,此时双方均建立连接,可以正常通信。
  • 为什么连接的时候是三次握手,关闭的时候却是四次握手? 答: 服务器在收到客户端的 FIN 报文段后,可能还有一些数据要传输,所以不能马上关闭连接,但是会做出应答,返回 ACK 报文段. 接下来可能会继续发送数据,在数据发送完后,服务器会向客户单发送 FIN 报文,表示数据已经发送完毕,请求关闭连接。服务器的ACK和FIN一般都会分开发送,从而导致多了一次,因此一共需要四次挥手。