协议分层

tcp 协议属于传输层协议,为应用层提供服务,保证数据的可靠传输。
image.png

image.png

tcp 连接的建立

客户端A,服务器B,初始序号seq,确认号ack . 初始状态:B处于监听状态,A处于打开状态 A -> B : seq = x (A向B发送连接请求报文段,A进入同步发送状态SYN-SENT) B -> A : ack = x+1,seq = y (B收到报文段,向A发送确认,B进入同步收到状态SYN-RCVD)
A -> B : ack = y+1 (A收到B的确认后,再次确认,A进入连接状态ESTABLISHED)
连接后的状态:B收到A的确认后,进入连接状态ESTABLISHED

why three-way handshake ?

tcp 是全双工的,要保证数据可靠传播,需要交换两个方向的序列号。


tcp 连接的关闭

A -> B : seq = u (A发出连接释放报文段,进入终止等待1状态FIN-WAIT-1) B -> A : ack = u

  • 1,seq = v (B收到报文段,发出确认,TCP处于半关闭,B还可向A发数据,B进入关闭等待状态WAIT) B -> A : ack = u
  • 1,seq = w (B重复发送确认号,进入最后确认状态LAST-ACK) A -> B : ack = w
  • 1,seq = u + 1 (A发出确认,进入时间等待状态TIME-WAIT) 经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态


tcp 是全双工的,所以,发送方和接收方都需要 Fin 和 Ack。只不过,有一方是被动的,所以看上去就成了所谓的4次挥手。如果两边同时断连接,那就会就进入到CLOSING状态,然后到达TIME_WAIT状态。

image.png

tcp 编程

socket 是 tcp 层的编程抽象,面向 tcp 编程就是面向 socket编程 ,使用经典的 c/s 架构编程。

image.png

tcp 建立连接抓包

websocket 连接建立过程,首先会建立tcp 连接。前三次 为tcp 握手过程:

image.png

tcp 关闭连接抓包

4次挥手,关闭连接抓包

image.png