TCP及socket通信原理

一、网络互联模型

   因特网在刚面世时,只有同一制造商生产的计算机才能彼此通信,制定网络互联模型的目的就是为异种的计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供共同的参考。

   互联参考模型:

      OSI七层模型(Open System Interconnect):应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

      DoD四层模型:是OSI七层模型的浓缩版,包括 进程/应用层、主机到主机层、因特网层、网络接入层

wKiom1Zs62yxZ-JhAABo8s6lMXM936.png

   以上两种模型是层次型的,分层模型的优点主要在于:

      ①将网络通信过程划分为更小、更简单的组件,这有助于组件的开发、设计和故障的排除

      ②定义了模型每层执行的功能,从而鼓励了行业标准化

      ③让不同类型的网络硬件和软件能够彼此通信

      ④避免对一层的修改而影响其它层


二、传输层协议

   目前主流的传输层协议有TCP和UDP。SCTP是TCP的改进版,DCCP是一个用来取代UDP的新的非可靠传输协议

   1、UDP(User Data Protocol,用户数据报协议):一种无连接的协议,提供面向事务的简单可靠信息传送服务,不建立会话,不对数据分段,不编号不排序,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。但正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序

     常用的UDP端口号有:DNS 53,TFTP 69,SNMP 161


   2、TCP(Transmission Control Protocol,传输控制协议):一种面向连接的、可靠、基于字节流的传输层通信协议。

     TCP实现可靠性的机制: 

        ①以通信双方之间建立连接      

        ②TCP把数据流分割为适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。

        ③TCP为了保证不发生丢包,就给每个报文段一个序号,同时序号也保证了接收端的按序接收。TCP报文段的到达也可能会失序,如有必要,TCP将对收到的报文段进行重新排序,将收到的数据以正确的顺序交给应用层

        ④接收端对已成功收到的包发回一个相应的确认(ACK);如果发送端在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传

        ⑤TCP用校验和函数来检验报文段是否有错误,在发送和接收时都要计算校验和,接收端若发现校验和有差错,将丢弃这个报文段和不确认收到此报文段。

        ⑥TCP还能提供流量控制:缓冲区(发送缓冲区、接收缓冲区)滑动窗口

        ⑦在拥塞控制上,采用慢启动拥塞避免算法

wKioL1ZtBp7gv8-hAANxbs3XuVE820.png


     ▲TCP在正式传输数据前需要经过三次握手建立连接,其过程如下:        

         ①客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。

         ②服务器端收到SYN报文,回应一个SYN(SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。

         ③客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。

     

     ▲在数据传输完毕后需要经过四次握手终止连接,其过程如下:

         ①某个应用进程首先调用close(),称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节(文件结束符),表示数据发送完毕。

         ②接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。

         注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。

         ③一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字,这导致它的TCP也发送一个FIN。

         ④接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。

      

      ▲TCP协议通过tcp状态来标记当前处于通信过程的哪个阶段:

         CLOSED, LISTEN, SYN_SENT(主动打开), SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIME_WAIT, CLOSED


三、套接字

  1、套接字(socket):应用层通过传输层进行数据通信时,TCP和UDP会遇到同时会多个应用程序进程提供并发服务的问题。区分不同的应用程序进程间的网络通信和连接,主要有三个参数:通信的目标IP地址、使用的传输层协议(TCP或UDP)、目标端口号,这种组合称为套接字。

       session:ip:port<==>ip:port

       端口分类

          众所周知的端口:0~1023,管理员才有权限使用,永久地分配给某应用使用;

          注册端口:1024~41951:只有一部分被注册,分配原则上非特别严格;

          动态端口或私有端口:41952+

            /proc/sys/net/ipv4/ip_local_port_range:定义两个数字,表示可以做为临时端口的起始数字和结束数字

  2、套接字类型:

      tcp socket(流式)

      udp socket(数据报式)

      raw socket(不使用TCP或UDP协议,应用层的应用程序直接通达IP层)


  3、socket通信在domain中实现,不同domain的socket地址格式不同在unix domain中是一个文件路径名,在ipv4 domain中是ipv4地址加端口号,在ipv6 domain中是ipv6地址加端口号     

      domain:

         Unix domain:基于socket机制实现同一主机不同进程间通信的一种方式;AF_UNIX,AF_LOCAL

         IPv4 domain:AF_INET,基于socket机制借助于ipv4协议实现不同主机(也可是同一主机)上的进程间的通信

         IPv6 domain:AF_INET6

    ▲虽然IPv4 domain能实现不同或同一主机进程间通信,但是对于同一主机进程间的通信应尽量使用Unix domain,socket在Unix domain中实现通信的方式就是在内存中创建一个可读写的文件作为进程间交互的中介,这种方式绕过了网络协议栈,节省了系统资源,提高了通信效率。


  4、tcp socket通信相关的系统调用

wKioL1ZtTUrDTqgzAAGSKhXNmxY457.png

       socket():创建一个新的socket

       bind():绑定于一个套接字地址上(服务器端会用到)

       listen():监听套接字

       accept():接收连接请求

       connect():发起连接请求

       close():关闭连接

       read()和write():recv(), send(), recvfrom(), sendto()

你可能感兴趣的:(tcp,socket)