tcp

OIS七层网络模型

物理层:以二进制的形式在物理机器上传输(光纤,光线,各种物理介质实现)

数据链路层:传输的地址帧以及错误检查

网络层:为我们的数据实现路由(路由器,交换机)

传输层:提供端口号和传输协议(TCP和UDP)

会话层:建立与应用程序的会话连接

表示层:数据转换,解决不同系统的兼容问题

应用层:http协议,文件服务器,邮件服务器


基础知识

TCP在网络OSI的七层模型中的第四层——Transport层,IP在第三层——Network层,ARP在第二层——Data Link层,在第二层上的数据,我们叫Frame,在第三层上的数据叫Packet,第四层的数据叫Segment。  

首先,我们需要知道,我们程序的数据首先会打到TCP的Segment中,然后TCP的Segment会打到IP的Packet中,然后再打到以太网Ethernet的Frame中,传到对端后,各个层解析自己的协议,然后把数据交给更高层的协议处理。  


TCP协议头的格式

    接下来,我们来看一下TCP头的格式:

    

你需要注意这么几点:

  • TCP的包是没有IP地址的,那是IP层上的事,但是有源端口和目标端口。
  • 一个TCP连接需要四个元组来表示是同一个连接(src_ip, src_port, dst_ip, dst_port)准确说是五元组,还有一个是协议。但因为这里只是说TCP协议,所以,这里我只说四元组。


注意上图中的四个非常重要的东西:

  • Sequence Number:是包的序号,用来解决网络包乱序(reordering)问题。
  • Acknowledgement Number:就是ACK——用于确认收到,用来解决不丢包的问题。
  • Window:又叫Advertised-Window,也就是著名的滑动窗口(Sliding Window),用于解决流控的。
  • TCP Flag :也就是包的类型,主要是用于操控TCP的状态机的。

TCP的状态机


很多人会问,为什么建链接要3次握手,断链接需要4次挥手?

  • 对于建链接的3次握手:主要是要初始化Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)——所以叫SYN,全称Synchronize Sequence Numbers。也就上图中的 x 和 y。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。
  • 对于4次挥手:其实你仔细看是2次,因为TCP是全双工的,所以,发送方和接收方都需要Fin和Ack。只不过,有一方是被动的,所以看上去就成了所谓的4次挥手。如果两边同时断连接,那就会就进入到CLOSING状态,然后到达TIME_WAIT状态


下面我们来看一下发送方的滑动窗口示意图: 

 

TCP/IP 通信