1. TCP协议
TCP协议的头部格式很重要,里面的很多参数都是必须要掌握的。
- Source Port
源端口 - Destination Port
目标端口 - Sequence Number
序列号,报文的第一个字节在数据流的序号,主要用来解决网络中乱序的可能。 - Acknowledgment Number
确认序号,是上一次收到的数据字节号加1,解决丢包问题 - Offset
用来确认可选字段的长度 - TCP的各个标志位
- URG:表示紧急指针域。用来保证TCP连接不被中断,并且监督中间层设备尽快处理这些数据。
- ACK:取值为0和1,0表示应答无效,1表示应答有效。
- PSH:表示Push操作。数据包在到达接收端后不要经过缓冲,直接到达应用程序。
- RST:复位操作,用来复位那些产生错误的连接。
- SYN:同步序号,建立连接。待会会讲怎么建立连接。
- FIN:结束报文,表示发送端已经到达数据末尾。
- Window:窗口大小,滑动窗口,用来进行流量控制。(之后博文分析)
2 三次握手的实现
三次握手的过程如下:首先客户端发送连接请求,将SYN标志位置为1,并将序号发送给服务端。服务端接收到后将确认号+1,同时将自己的序号发送给客户端。客户端收到服务器的SYN和ACK后,将ACK序号置为服务器的序号+1,完成三次握手。
四次挥手的过程如下:
第一次 结束方(客户端或者服务器)设置序号和ACK,发送FIN报文,,结束方此时进入FIN_WAIT_1状态。
第二次 在收到结束方的FIN报文的时候,回复一个ACK报文,结束方进入FIN_WAIT_2状态。
第三次 被结束方向结束方发送FIN报文段,请求关闭连接。
第四次 结束方收到FIN报文后回复ACK报文,结束方进入了TIME_WAIT阶段。结束方等待2MSL后关闭连接。
问题:
- 为什么采用三次握手而不是两次握手?
保证传输的可靠性和高效的传输。如果是两次握手的话,客户端有可能不会确认自己收到了服务器的序号(客户端第一次请求很晚被服务器收到,而客户端认为这是一个失败的请求),导致资源浪费。