在我们的OSI七层模型或者是四层模型中,我们的传输层始终保持不变,传输层负责定义两台主机进程之间的通信,提供数据传输服务,提供端到端的可靠传输,所以我们需要用到的两个主要的协议是:
TCP协议:传输控制协议,提供面向连接、可靠的数据传输服务,主要提供完整性服务
UDP协议:用户数据协议,提供无连接、尽最大努力交互的服务,不保证数据的可靠性,主要提供及时性服务
TCP协议
TCP协议首部组成:
源端口和目的端口(4个字节)
源端口是发送端,目的端口是接收方,各自占2个字节
序号(4个字节)
传送的数据的数据流中每一个字节都拥有自己的序号,序号表示本报文段所发送的数据的第一个字节的序号,代表每次数据发送的位置,每发送一次就累加一次该数据字节数的大小,序号是计算机生成的随机数。
确认号(4个字节)
期望收到对方的下一个报文段数据的第一个字节的序号
数据偏移(4位)
表示数据部分距离报文首部的偏移量,“数据偏移”的计算单位是4个字节,数据偏移量是占四位,那么最大表示为1111,最大1111表示15 x 4= 60个字节,即表示TCP首部最大长度为60个字节,因此“选项”部分最多40个字节。
保留字段(4位)
一般设置为0
标志位(8位)
- 紧急(URG):URG=1表示紧急指针有效,需要尽快传送,不需要排队直接优先传输
- 确认(ACK):对已接受数据的确认,默认为0,建立连接后,所以传送的报文都必须将ACK置为1,当ACK=1表示确认号字段有效
- 同步(SYN):在链接建立时使用,SYN=1,ACK=0表示是一个链接请求,若对方同意建立连接,则响应报文段为SYN=1,ACK=1
- 推送(PSH):接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
- 复位(RST):当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
- 终止(FIN):FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
窗口
窗口值作为接受方让发送方设置其发送窗口的依据,单位为字节(限制是因为接受方的数据缓存空间是有限的)
检验和(占 2 字节)
检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
紧急指针(占 16 位)
指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
TCP三次握手和四次挥手
三次握手
第一次握手(SYN=1, seq=x)
客户端向服务端发送了一个TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。 发送完毕后,客户端进入 SYN_SEND 状态。第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1)
服务端收到了用户端的请求,同意建立连接,然后服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。
第三次握手(ACK=1,ACKnum=y+1)
客户端收到了服务端同意连接的确认后,再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1
发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。四次挥手
第一次挥手(FIN=1,seq=x)
客户端向服务端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,客户端主动释放客户端到服务端的TCP连接。
第二次挥手(ACK=1,ACKnum=x+1)
服务端收到了客户端的请求释放报文,给客户端发送确认报文。从客户端到服务端这个方向上的连接就释放了,TCP连接处于半关闭状态。此时客户端无法发送数据给服务端,但是服务端还可以发送数据给客户端,客户端仍可以接收。
服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。第三次挥手(FIN=1,seq=y)
服务端没有数据再发给客户端数据,其应用进程就通知TCP释放连接,并向客户端发送确认报文。服务器释放服务器到客户端的TCP连接,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。
第四次挥手(ACK=1,ACKnum=y+1)
客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。 服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。 客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。UDP协议
UDP特点
- 用户数据报协议UDP(User Datagram Protocol) 是传输层的协议,无连接(即发送数据之前不需要建立连接)。
- UDP 面向报文传输,不保证可靠交付,同时也不使用拥塞控制,适合多媒体通信的要求。
- UDP 支持一对一、一对多、多对一和多对多的交互通信。
- UDP 的首部开销小,只有 8 个字节
首部格式
- UDP的首部没有“序号”字段,因为UDP协议只需要传输一个数据包,所以不需要序号。
- 用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段有 8 个字节,由 4 个字段组成,每个字段都是两个字节。
TCP和UDP的区别
面向连接:TCP协议需要建立连接,仅支持一对一通信;UDP协议无需建立连接,支持一对一、一对多、多对一和多对多的交互通信。
可靠传输:TCP协议通过确认应答、连接管理、流量控制、拥塞控制来确保可靠性传输;UDP不保证可靠性传输。
性能效率:TCP协议传输效率慢,需要较多的资源开销。UDP协议传输效率快,需要较少的资源开销。
首部格式:TCP协议的首部需要20-60个字节,UDP协议需要8个字节。
应用场景:TCP要求通信数据可靠(比如文件传输、邮件传输等),UDP适用于哟求通信速度快(如音频、视频等)