本文主要介绍TCP协议
TCP三次握手
既然说TCP是面向连接的协议。那么两个主机在进行TCP通信前就需要先建立TCP连接,也就是著名的三次握手。所谓三次握手就是指两个主机为了建立连接总共来回发送的三个报文。
三次握手示意图
-
第一次握手:Client发送一个TCP包到Server。其中SYN=1代表这是一个请求建立连接的包,seq为一个随机值,用处下一步会讲。然后Client就处于SYN_SENT状态了。这就相当于我(client)和朋友(Server)站在两个山顶,我想找他说话,就对着他喊“喂!你能听到吗?"。喊完后我就相当于SYN_SENT状态了,坐等他的回应。
-
第二次握手:Server这时候收到一个TCP包,看到SYN为1,ACK为0(因为ACK是1个bit,不是1就是0,因为刚才Client没有显式指定,所以默认为0)。就知道这是一个Client想和我建立连接了。这时Server就会回应Client:SYN=1,代表了这是一个请求建立连接的包。ACK=1,代表了这是回应Client请求的。同样也给了一个seq随机数。返回的ack = client传过来的seq+1,这代表我这个包是给刚才Client的包回应的,然后Server的状态会变成SYN_RCVD。所有这些字段合在一起就是想表达:Hi, Client 我收到你建立连接的请求了,我也愿意建立请求。这就相当于我朋友听到我呼喊他后回应我"我听到你说话了,你能听到我吗?“。
-
第三次次握手:客户端收到Server的回应后能说明一个问题:我刚才的请求Server收到了,并且他同意和我建立连接。然后Client会再给Server一个包,其中ACK=1,代表回应Server,ack=Server的seq+1代表是给刚才那个包的回应。发送完后Client状态变为ESTABLISHED,代表Client这边已经没啥事了,连接建立好了。Server这边收到Client最后一个握手后就知道:"Client给我回应了,看来他能听到我说话“,然后Server状态也变成ESTABLISHED。这就相当于我听到朋友的回应后,非常高兴,然后告诉他我能听到他说话。至此,通信的两方都知道对方能听到自己说话了。连接就建立好了。
TCP四次挥手
连接建立后可以由任何一方申请断开连接。我们假设是由Client发起的。
四次挥手示意题
- Client发起挥手。FIN=1代表这是断开连接的申请,seq的作用同握手。这就相当我我(Client)给山那头的朋友说“我没啥事了,你还有啥事吗,没事咱就别聊了”。
- Server收到Client的断开连接申请后,先立即给Client回一个消息,其中ACT=1代表这是一个回应,ack代表这是给刚才那个消息的回应。告诉Client我知道了,但你先等等,让我看看我这还有啥东西没有发送完。Client收到Server的回复后就等看Server还有什么数据过来。朋友听到我的话后,连忙说等一等,让我想想我还有啥没说完的吗?我听到后就坐等他还有啥话说。
- Server这边确认没啥东西了后就再告诉Client我这没东西了,可以断开连接了。此时FIN=1代表Server也确认申请断开连接。ack仍然代表是给最初Client的回应。等了一会后,他告诉我“OK,我这没啥了,那就不聊了"。
- Client收到Server确认断开的消息后,最后还需要告诉Server,我收到你确认断开连接的消息了,你可以关闭连接了。然后再等待2MSL,为什么会等下来会讲。Server收到最后一条消息后就关闭连接了。Client等待完成没有收到回复后也就关闭连接了。我听到朋友确认没啥事后,再回应他“没事了就好,那我先撤了"。