协议分层
tcp 协议属于传输层协议,为应用层提供服务,保证数据的可靠传输。
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状态。
tcp 编程
socket 是 tcp 层的编程抽象,面向 tcp 编程就是面向 socket编程 ,使用经典的 c/s 架构编程。
tcp 建立连接抓包
websocket 连接建立过程,首先会建立tcp 连接。前三次 为tcp 握手过程:
tcp 关闭连接抓包
4次挥手,关闭连接抓包