序列号seq: 用来标记数据段的顺序
确认号ack: 期待收到对方下一个报文段的第一个数据字节的序号;
确认ACK: 仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
同步SYN: 连接建立时用于同步序号。
客户端与服务器之间的建立连接:
举个简单的例子
你要找你朋友开黑,首先要
问
他:“开不开黑?"
然后他接收到你的消息后回
了你句:“来啊”
最后你接收到他的消息后立马回
复了句:“上号!”,以表示握手成功。
到正题了
TCP
握手为什么需要三次呢,如果把最后一次的去掉改为两次握手是否可行呢?
假如客户端向服务端进行握手,进行第一次请求时,可能会遇到网络信号差或者服务器负载过多,导致这个握手请求没有立即达到服务端这就形成了一个失效的握手连接,但是服务端接收到失效的请求报文就会误认为是客户端又发了一次连接请求,服务端就会进行第二次握手。
如果说TCP握手是两次的话,只要服务端确认消息就算建立连接了,这是不可靠的。
假如现在客户端并没有发出建立连接的请求,之前发过的这个请求是失效的请求,一切都是服务端在自相情愿,因此客户端是不会理睬服务端的确认信息,也不会向服务端发送确认的请求,但是服务器却认为新的连接已经建立起来了,并一直等待客户端发来数据,这样的情况下,服务端的很多资源就没白白浪费掉了。
总结
TCP
采用三次握手的办法就是为了防止上述这种情况的发生,比如客户端不会向服务端发出确认的请求,服务端会因为收不到确认的报文,就知道客户端并没有要建立连接,那么服务端也就不会去建立连接,这就是三次握手的作用。