又到了一年一度的黄金3月了,作为网络的必问内容, 有必要好好回忆下了.
1
TCP报文格式
其中比较重要的字段有:
(1)序号(sequence number): Seq序号, 占32位, 用来标识从TCP源端向目的端发送的字节流, 发起方发送数据时对此进行标记.
(2)确认号(acknowledgement number): Ack序号, 占32位, 只有ACK标志位为1时, 确认序号字段才有效, Ack=Seq 1.
(3)标志位(Flags): 共6个, 即URG、ACK、PSH、RST、SYN、FIN等. 具体含义如下:
URG: 紧急指针(urgent pointer)有效.
ACK: 确认序号有效.
PSH: 接收方应该尽快将这个报文交给应用层.
RST: 重置连接.
SYN: 发起一个新连接.
FIN: 释放一个连接.
需要注意的是:
不要将确认序号Ack与标志位中的ACK搞混了. 确认方Ack=发起方Seq 1, 两端配对.
2
三次握手
(1)第一次握手: Client将标志位SYN置为1, 随机产生一个值seq=x, 并将该数据包发送给Server, Client进入SYN_SENT状态, 等待Server确认.
(2)第二次握手: Server收到数据包后由标志位SYN=1知道Client请求建立连接, Server将标志位SYN和ACK都置为1, ack=x 1, 随机产生一个值seq=y, 并将该数据包发送给Client以确认连接请求, Server进入SYN_RCVD状态.
(3)第三次握手: Client收到确认后, 检查ack是否为x 1, ACK是否为1, 如果正确则将标志位ACK置为1, ack=y 1, 并将该数据包发送给Server, Server检查ack是否为y 1, ACK是否为1, 如果正确则连接建立成功, Client和Server进入ESTABLISHED状态, 完成三次握手, 随后Client与Server之间可以开始传输数据了.
3
四次挥手
(1)第一次挥手: Client发送一个FIN, 用来关闭Client到Server的数据传送, Client进入FIN_WAIT_1状态 .
(2)第二次挥手: Server收到FIN后 , 发送一个ACK给Client, 确认序号为收到序号 1(与SYN相同, 一个FIN占用一个序号), Server进入CLOSE_WAIT状态 .
(3)第三次挥手: Server发送一个FIN, 用来关闭Server到Client的数据传送, Server进入LAST_ACK状态.
(4)第四次挥手: Client收到FIN后, Client进入TIME_WAIT状态, 时间是2MSL(最大分段生存期, 默认2分钟), 接着发送一个ACK给Server, 确认序号为收到序号 1 , Server进入CLOSED状态, 完成四次挥手.
小结
记住这些, 你的网络问答可以拿60分了