用户数据报协议UDP(User Datagram protocol)是无连接的,仅最大可能交付,没有拥塞控制,面向报文(对于应用传下来的报文不合并也不拆分,只添加UDP首部),支持一对一,一对多,多对一,多对多的交互通信。
传输控制协议TCP(Transmission Control protocol)是面向连接的,提供可靠交付,有拥塞控制,流量监控,通过双工通信,面向字节流(把应用层传下来的看成字节流,把字节流组织成大小不等的数据块),每一条TCP连接只能是点对点的(一对一)。
UDP首部格式:
首部字段只有8个字节,包括源端口、目的端口、长度、检验和。12字节的伪首部是为了计算校验和临时添加的。
TCP首部格式
序号:对于字节流进行编号,例如序号为301,表示第一个字节的标号为301,如果携带的数据长度为100字节,那么下一个报文段的序号为401.
确定号:期望收到的下一个报文的序号,例如B正确收到A发送来的一个报文段,序号为501,携带的数据长度为200字节,因此B期望下一个报文段的序号为701,B发送给A的确认报文段中的确认好为701.
数据偏移:指的是数据部分距离报文段起始的偏移量,实际上指的是首部长度。
确认ACK:当ACK=1时确认号确认号字段有效,否则无效。TCP规定,在连接建立后所传送的报文必须把ACK置1。
同步SYN:在连接建立时用来同步序号。当SYN=1,ACK=0时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中SYN=1,ACK=1.
终止FIN:用来释放一个连接,当FIN=1,ACK=0时表示这是一个连接请求报文段,若对方同意建立连接,则响应报文中SYN=1,ACK=1
窗口:窗口作为接受方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
TCP如何保证可靠传输
- 校验和:TCP将保证他首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果收到段的校验和有差错,TCP将丢弃这个报文段和不确认收到此报文段
- 流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大可变小的滑动窗口协议。(TCP利用滑动窗口来进行流量控制)。
- 拥塞控制:当网络拥塞时,减少数据的发送(慢开始、拥塞避免、快重传、快恢复)。
- 停止等待协议:也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后在发下一个分组。超时重传:当TCP发出一个段后,他启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
TCP的三次握手:
左边为客户端,右边为服务端:
- 首先服务端处于监听状态,等待客户的连接请求。
- 客户端主动打开,向服务端发送请求连接报文,SYN=1,ACK=0,选择一个初始的序号x(seq = x)。
- 服务端收到连接请求报文,如果同意建立连接,则向客户端发送连接确认报文,SYN=1,ACK=1,确认号为x+1,同时也选择一个出事的序号y(seq=y)。
- 客户端收到服务端的连接确认报文后,还要向服务端发出确认,确认号为y+1,序号为x+1。
- 服务端收到客户端的确认后,连接建立。
三次握手的原因:
第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。
客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不会进行三次握手,因此就不会在打开连接。
TCP的四次挥手:
左边为客户端,右边为服务端:(注:发起断开的可以是客户端,也可以是服务端)
- 第一次挥手,客户端发送连接释放报文,FIN=1.客户端进入FIN_WAIT_1状态,表示客户端没有数据再会发送给服务端(TCP属于于半关闭状态)。
- 第二次挥手,服务端接收到客户端发送到的FIN报文段(进入CLOSE_WAIT状态),发出确认(ACK,seq),此时服务端还能向客户端发送数据。客户端进入TIME_WAIT_2状态。
- 第三次挥手,当服务端不再需要连接时,服务端向客户端发送连接释放报文,FIN=1。同时服务端进入LAST-ACK状态。
- 第四次挥手,客户端收到发出的确认返回ACK,进入TIME-WAIT状态,等待2MSL(报文最大存活时间)后如果没有收到回复,则证明服务端已经正常关闭,则释放连接。服务端收到客户端的确认后释放连接。
四次挥手的原