有关计算机网络UDP、TCP握手,挥手知识点梳理

传输层概

作用:传输层为它上面的应用层提供通信服务。

在OSI七层参考模型中,传输层是面向通信的最高层,也是用户功能的最底层。

传输层两大重要的功能:复用 和 分用。

复用:在发送端,多个应用进程公用一个传输层;

分用:在接收端,传输层会根据端口号将数据分派给不同的应用进程。

和网络层的区别:

网络层为不同主机提供通信服务,而传输层为不同主机的不同应用提供通信服务。

网络层只对报文头部进行差错检测,而传输层对整个报文进行差错检测。

UDP(用户数据报协议)详解

UDP的特点

UDP只在IP数据报服务的基础上增加了少量的功能:复用与分用、对整个报文的差错检测。

UDP是无连接的

通信前不需要建立连接,通信结束也无需释放连接。

UDP是不可靠的

它是尽力而为交付,不能确保每一个数据报都送达。

UDP是面向报文的

所谓『面向报文』就是指:UDP数据传输的单位是报文,且不会对数据作任何 拆分 和 拼接 操作。

在发送端,应用程序给传输层的UDP什么样的数据,UDP不会对数据进行切分,只增加一个UDP头并交给网络层。

在接收端,UDP收到网络层的数据报后,去除IP数据报头部后遍交给应用层,不会作任何拼接操作。

UDP没有拥塞控制

UDP始终以恒定的速率发送数据,并不会根据网络拥塞情况对发送速率作调整。这种方式有利有弊。

弊端:网络拥塞时有些报文可能会丢失,因此UDP不可靠。

优点:有些使用场景允许报文丢失,如:直播、语音通话,但对实时性要求很高,此时UDP还是很有用武之地的。

UDP支持一对一、一对多、多对多、多对一通信

而TCP只支持一对一通信。

UDP首部开销小,只有8字节。

而TCP头部至少由20字节,相比于TCP要高效很多。

UDP报文头

有关计算机网络UDP、TCP握手,挥手知识点梳理

 

  • 源端口
  • 目的端口
  • 长度:整个数据报的长度
  • 检验和:整个数据报的检验和。

TCP(传输控制协议)详解

TCP特点

TCP是面向连接的

通信前需要建立连接,通信结束需要释放连接。

TCP提供可靠交付服务

所谓『可靠』指的是:TCP发送的数据无重复、无丢失、无错误、与发送端顺序一致。

TCP是面向字节流的

所谓『面向字节流』指的是:TCP以字节为单位。虽然传输的过程中数据被划分成一个个数据报,但这只是为了方便传输,接收端最终接受到的数据将与发送端的数据一模一样。

TCP提供全双工通信

所谓『全双工通信』指的是:TCP的两端既可以作为发送端,也可以作为接收端。

一条TCP连接的两端只能有两个端点

TCP只能提供点到点的通信,而UDP可以任意方式的通信。

TCP连接 与 套接字

什么是『TCP连接』?

TCP连接是一种抽象的概念,表示一条可以通信的链路。每条TCP连接有且仅有两个端点,表示通信的双方。且双发在任意时刻都可以作为发送者和接收者。

什么是『套接字』?

一条TCP连接的两端就是两个套接字。套接字=IP地址: 端口号。因此,TCP连接=(套接字1,套接字2)=(IP1:端口号1,IP2:端口号2)

TCP头部

有关计算机网络UDP、TCP握手,挥手知识点梳理

 

TCP头部长度有20字节的固定部分,选项部分长度不定,但最多40字节,因此TCP头部在20-60字节之间。

源端口 和 目的端口

传输层和网络层一大重要区别就是传输层指定了数据报发往的应用进程,因此需要端口号标识。

序号

当前TCP数据报数据部分的第一个字节的序号。我们知道,TCP是面向字节的,它会对发送的每一个字节进行编号,而且不同数据报之间是连续编号的。

由于本字段4字节,可以给[0,2^32-1]个字节进行编号(大约4G),而且序号循环使用,当发送完2^32-1个字节后,序号又从0开始。一般来说,当2^32-1个字节被发送的时候,前面的字节早就发送成功了,因此序号可以循环使用。

确认号

表示当前主机作为接收端时,期望接收的下一个字节的编号是多少。也表示,当前主机已经正确接收的最后一个字节序号+1。

数据偏移(报文长度)

它表明了数据报头部的长度。

保留字段

标识符

TCP有7种标识符,用于表示TCP报文的性质。它们只能为0或1。

URG=1

当URG字段被置1,表示本数据报的数据部分包含紧急信息,此时紧急指针有效。紧急数据一定位于当前数据包数据部分的最前面,紧急指针标明了紧急数据的尾部。如control+c:这个命令要求操作系统立即停止当前进程。此时,这条命令就会存放在数据包数据部分的开头,并由紧急指针标识命令的位置,并URG字段被置1。

ACK=1

ACK被置1后确认号字段才有效。此外,TCP规定,在连接建立后传送的所有报文段都必须把ACK置1。

PSH=1

当接收方收到PSH=1的报文后,会立即将数据交付给应用程序,而不会等到缓冲区满后再提交。一些交互式应用需要这样的功能,降低命令的响应时间。

RST=1

当该值为1时,表示当前TCP连接出现严重问题,必须要释放重连。

SYN=1

SYN在建立连接时使用。当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文。当SYN=1,ACK=1时,表示当前报文段是一个同意建立连接的应答报文。

FIN=1

FIN=1表示此报文段是一个释放连接的请求报文。

接收窗口大小

该字段用于实现TCP的流量控制。它表示当前接收方的接收窗口的剩余容量,发送方收到该值后会将发送窗口调整成该值的大小。发送窗口的大小又决定了发送速率,所以接收方通过设置该值就可以控制发送放的发送速率。发送方每收到一个数据报都要调整当前的发送窗口。

检验和

用于接收端检验整个数据包在传输过程中是否出错。

紧急指针

用于标识紧急数据的尾部。

选项字段

上述字段都是每个TCP头部必须要有的,而选项字段是可选的,且长度可变,最长40字节。

最常用的选项字段为MMS:最大报文长度。

TCP三次握手

有关计算机网络UDP、TCP握手,挥手知识点梳理

 

PS:TCP协议中,主动发起请求的一端称为『客户端』,被动连接的一端称为『服务端』。不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据。

起初,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。

服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。

第一次握手

客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,seq=x。请求发送后,客户端便进入SYN-SENT状态。

PS1:SYN=1,ACK=0表示该报文段为连接请求报文。

PS2:x为本次TCP通信的字节流的初始序号。

TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号。

第二次握手

服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。该应答发送完成后便进入SYN-RCVD状态。

PS1:SYN=1,ACK=1表示该报文段为连接同意的应答报文。

PS2:seq=y表示服务端作为发送者时,发送字节流的初始序号。

PS3:ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。

第三次握手

当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。该报文段的头部为:ACK=1,seq=x+1,ack=y+1。

客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!

为什么连接建立需要三次握手,而不是两次握手?

防止失效的连接请求报文段被服务端接收,从而产生错误。

PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。

若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。

TCP四次挥手

有关计算机网络UDP、TCP握手,挥手知识点梳理

 

TCP连接的释放一共需要四步,因此称为『四次挥手』。我们知道,TCP连接是双向的,因此在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。

第一次挥手

若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u。此时,A将进入FIN-WAIT-1状态。

PS1:FIN=1表示该报文段是一个连接释放请求。

PS2:seq=u,u-1是A向B发送的最后一个字节的序号。

第二次挥手

B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:ACK=1,seq=v,ack=u+1。

PS1:ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。

PS2:seq=v,v-1是B向A发送的最后一个字节的序号。

PS3:ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。

A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。

第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。

第三次挥手

当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。B便进入LAST-ACK状态。

第四次挥手

A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。