2.1 TCP(Transmission Control Protocol,传输控制协议)
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号之后,给每一个报文段指派一个序号;序列号seq就是这个报文段中第一个字节的数据编号。
确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号字段无效。
同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个请求连接报文段。若同意连接,则在响应报文段中使SYN=1,ACK=1.因此,SYN=1表示这个一个连接请求,或接受连接报文。SYN标志位只有在TCP建立连接时被置为1,握手完成后SYN被置为0。
终止FIN:用来释放一个连接,FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接。
URG:紧急指针是否有效。若为1,表示某一位需要被优先处理。
PSH:提示接收端应用程序立即从TCP缓冲区把数据读走。
RST:对方要求重新建立连接,复位。
PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
2.1.1 TCP三次握手过程理解:
第一次握手:建立连接时,客户端发送同步syn包(SYN=1,seq=x)到服务器,此时客户端为SYN_SENT状态,等待服务器确认。
第二次握手:服务器收到syn包,确认客户端的SYN,同时自己发送一个同步+确认的SYN+ack包(SYN=1,ack=x+1,ACK=1,seq=y)给客户端,此时服务端为SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ack包,向服务器发送确认ack包(ack=y+1,ACK=1,seq=x+1),此包发送完毕,客户端与服务器进入ESTABLISHED(TCP连接成功)状态。
2.1.2 TCP四次挥手过程理解:
第一次挥手:客户端发出连接释放报文,并停止发送数据,释放报文首部,FIN=1,seq=u,此时客户端为FIN-WAIT-1(终止等待1)状态。
第二次挥手:服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,seq=v,此时服务端进入CLOSE-WAIT(关闭等待)状态。服务端把未发送的数据继续发送。
客户端收到确认报文后,进入FIN-WAIT-2(终止等待2)状态,继续接受数据等待服务器发出连接释放报文。
第三次挥手:服务器将数据发送完毕,就向客户端发送连接释放报文,FIN=1,ACK=1,ack=u+1,此时服务器进入了LAST-ACK(最后确认)状态,等待客户端确认。
第四次挥手:客户端收到连接释放报文,发出确认报文,ACK=1,ack=w+1,seq=u+1,此时,客户端进入TIME-WAIT(时间等待)状态,经过2**MSL(最长报文段寿命)时间后,撤销相应的TCB,进入CLOSED状态。服务器收到确认报文后,立即进入CLOSED状态。
2.1.3累计确认
首先为了保证顺序性,每个包都有一个 ID。在建立连接的时候会商定起始 ID 是什么,然后按照 ID 一个个发送,为了保证不丢包,需要对发送的包都要进行应答,当然,这个应答不是一个一个来的,而是会应答某个之前的 ID,表示都收到了,这种模式成为累计应答或累计确认。
为了记录所有发送的包和接收的包,TCP 需要发送端和接收端分别来缓存这些记录,发送端的缓存里是按照包的 ID 一个个排列,根据处理的情况分成四个部分
- 发送并且确认的
- 发送尚未确认的
- 没有发送等待发送的
- 没有发送并且暂时不会发送的
这里的第三部分和第四部分就属于流量控制的内容
在 TCP 里,接收端会给发送端报一个窗口大小,叫 Advertised window。这个窗口应该等于上面的第二部分加上第三部分,超过这个窗口,接收端做不过来,就不能发送了。
对于接收端来讲,它的缓存里面的内容要简单一些
- 接收并且确认过的
- 还没接收,但是马上就能接收的
- 还没接收,但也无法接收的
2.2 UDP(User Data Protocol,用户数据报协议)
UPD的包头比较简单,包含源端口号和目标端口号。有以下特点:
- 结构简单;
- 不建立连接,但是监听,谁给他传数据,他就给谁传数据,也可以同时传给多个;
- 不管网络堵塞与丢包;
应用场景:直播、实时游戏、物联网
(1)TCP和UDP的区别:
- TCP 是面向连接的,UDP 是面向无连接的
- UDP程序结构较简单
- TCP 是面向字节流的,UDP 是基于数据报的
- TCP 保证数据正确性,UDP 可能丢包
- TCP 保证数据顺序,UDP 不保证
(2)什么是面向连接,什么是面向无连接?
在互通之前,面向连接的协议会先建立连接,如 TCP 有三次握手,而 UDP 不会
(3)TCP 为什么是可靠连接?
- 通过 TCP 连接传输的数据无差错,不丢失,不重复,且按顺序到达。
- TCP 报文头里面的序号能使 TCP 的数据按序到达
- 报文头里面的确认序号能保证不丢包,累计确认及超时重传机制
- TCP 拥有流量控制及拥塞控制的机制