TCP/IP 的一些学习

还记得两三年前,去一个大数据公司面试。首先要笔试,题目中有道题目就是填空TCP报文的表格。
首先我们看看TCP的报头:

Sample Image Added via Markdown

当时觉得这是啥玩意呀。考这东西跟大数据有毛线关系。今天,才明白,这些都是计算机的基础。基本功来的,跑不了。

下面我们可以通过一张图就能比较清晰地展现TCP/IP建立连接的过程。也就是我们常说的3次握手,4次挥手。

我们先看3次握手的过程:
Sample Image Added via Markdown

1.首先Server端是处在一个Listen的状态。经常你用netstat可以看到,比如打开了一个web 服务,就卡看到80端口处在listen状态
2.由客户端发送一个Segment(传输层的数据包单位)到服务的,主要内容有 SYN=1,seq=x(一个随机数)。发送后,客户端状态变为SYN-SENT
3.服务端收到客户端发送的Segment,状态变为SYN-REVD,并发送一个SYN=1,ACK=1,seq=y,ack=x+1 的Segment返还给客户端。表示自己收到了你的消息。
4.客户端收到服务端返还的内容后,状态就变成了ESTABLISHED。表示成功建立了连接。并且再次发送一个ACK=1,ack=y+1,seq=x+1 的Segment。
5.服务端收到客户端发来的Segment后,状态变为ESTABLISHED。成功完成3次握手。

建立一次连接,需要3次握手,也就是说发送3个数据包即可建立连接。发送的数据包内容中我们可以发现一点规律。ack的数值内容都是对方发送给自己的seq数值 +1 。

接下来我们看看4次挥手的过程。
Sample Image Added via Markdown

1.首先由终端的提出方(假设是客户端)发送一个FIN=1,seq=u 的Segment到服务端。发送后客户端状态变为FIN-WAIT-1
2.服务端收到了客户端的Segment后状态变为CLOSE-WAIT,并反回一个ACK=1,seq=v,ack=u+1 的Segment给客户端。
3.客户端收到了服务端返回的消息后状态变为FIN-WAIT-2,此时服务端并没有关闭,意思是告诉客户端,请您耐心等待,我看看还有什么数据没有给你的,把剩下的数据发给你先。
4.过了片刻,服务端发送一个FIN=1,ACK=1,seq=w,ack=u+1 的Segment给客户端。然后服务端状态变为了LAST-ACK。
5.客户端收到了服务端发来的消息后,状态变为了TIME-WAIT。并发送ACK=1,seq=u+1,ack=w+1的Segment。表示我知道了,我再等等你(2MSL)还有什么话跟我说的。没有的话我就关了。
6.服务端收到客户端发送的消息后,状态就变为CLOSED了。