TCP协议图文解释

简述: TCP是面向连接的安全的传输, 不会丢失数据(只是丢失之后会重新发送), TCP连接需要三次握手.
TCP通信数据段如图:

《TCP协议图文解释》 TCP数据段.png

三次握手, 通信, 四次握手如图:

《TCP协议图文解释》 TCP通信.png

  • 三次握手: 1 – 3
    (1) 首先client 给server发送连接请求, 对应标识位SYN, 随机生成一个32位序号:1000, 那么server应答的时候ACK对应的应为1001 并带有一个mss, mss表示最大段尺寸,如果一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP层分片,为了避免这种情况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长度。
    (2) 当server收到client的连接请求时, 先判断SYN标志位是否为1, 然后做出应答, 对应的应答标志位是ACK, 并以client端发送的SYN请求生成的32位序号+1作为应答(ACK)的确认序号; 并且也向client发送连接请求(SYN), 也生成一个随机32位序号8000, 表示server端向client发送的连接请求的序号, 那么client应答的时候ACK对应的应为8001.
    (3) client收到server的应答(ACK-1001), 和server的连接请求(SYN-8000)之后, 判断ack是否为1, 序号是否是发过去的1000+1, 然后判断syn是否为1, 然后需要对服务器的连接请求做应答ACK, 对应携带的确认序号为8001.
    此时建立连接
  • 通信
    (4) client向server发送数据, 1001(20)表示发送数据是20字节, 并且再确认上次的回复8001(对应的是server SYN生成的序号+1)
    (5) server收到数据后做应答, ACK 对应的序号应为1001+20, 表示server收到了20字节, 并且向client发送数据, 8001(10)表示发送数据是10字节,
    (6) client收到数据之后应答ACK为8001+10, 表示收到了10字节, 这时没有再发数据
  • 四次握手 – 断开连接, 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
    (7) client发出段7, 对应标识位:FIN, 表示关闭连接的请求, 对应32位序号是server应答client的ACK(1021), 发送0字节数据, 并确认上次收到10字节数据, 对server的应答ACK对应确认序号为8011.(此时为半关闭状态)
    (8) 服务器发出段8,应答客户端的关闭连接请求。
    (9) 紧接着服务器发出段9,其中也包含FIN位,向客户端发送关闭连接请求。
    (10) 客户端发出段10,应答服务器的关闭连接请求。
    建立连接的过程是三方握手,而关闭连接通常需要4个段,服务器的应答和关闭连接请求通常不合并在一个段中,因为有连接半关闭的情况,这种情况下客户端关闭连接之后就不能再发送数据给服务器了,但是服务器还可以发送数据给客户端,直到服务器也关闭连接为止。
    原文作者:dab61956e53d
    原文地址: https://www.jianshu.com/p/a7c94644d145
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞