network protocol

网络协议基本原理

面试要点

  • 什么是TCP/IP?
  • TCP建立连接为什么要三次握手,断开连接时为什么又要四次挥手呢?
  • SSL/TLS握手过程?

网络分层模型

OSI七层网络模型

OSI模型:Open System Interconnection,开放式系统互联。国际标准化组织(ISO)制定的理论模型。

TCP/IP四层网络模型

TCP/IP模型:基于OSI建立的实际实现的模型。

计算机网络体系结构分层

OSI七层模型 TCP/IP概念层模型 功能 TCP/IP协议族
应用层 应用层 文件传输,电子邮件,文件服务,虚拟终端 HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP、TLS
表示层 数据格式化,代码转换,数据加密 XDR、ASN.1、NCP、TLS、ASCII
会话层 保证多个参与方之间交互的控制
传输层 传输层 为上层提供数据可靠性传输服务 TCP、UDP、RTP、SCTP、SPX、ATP、IL
网络层 网络层 创建统一协议,通过路由将多个网络连接起来 IP、ICMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、X.25
数据链路层 网络接口层(链路层) 保证帧数据的传递 以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP
物理层 处理字节流的传输 调制解调器、无线电、光纤

socket

应用层和内核互通的机制,就是通过socket系统调用。那socket属于那一层呢?其实它哪一层都不属于,它属于操作系统的概念,而非网络协议分层的概念。只不过操作系统选择对于网络协议的实现模式是,二到四层的处理代码在内核里面,七层的处理代码让应用自己去做,两者需要跨内核态和用户态通信,就需要一个系统调用完成这个衔接,这就是socket。

ISO/OSI参考模型 数据处理流程

  • 应用程序处理:应用层会对程序进行编码处理,这些编码相当于表示层的功能,对于何时建立连接以及何时发送数据的管理就是会话层的功能。
  • 传输层处理:已TCP为例,负责建立连接,发送数据以及断开连接。发送数据时需要在应用层数据头部加上TCP首部。
  • 网络层处理:IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,参考路由控制表决定接受此 IP 包的路由或主机。
  • 网络接口层:

传输层中的TCP和UDP

  • TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP 为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。
  • UDP 是无连接的, 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。
  • TCP 和 UDP 的优缺点无法简单地、绝对地去做比较:TCP 用于在传输层有必要实现可靠传输的情况;而在一方面,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。TCP 和 UDP 应该根据应用的目的按需使用。
  • 传输层TCP和UDP协议里面,都有端口的概念,不同的应用监听不同的端口。

针对TCP编程

单工、半双工和全双工

  • 单工:简单的说就是一方只能发信息,另方则只能收信息,通信是单向的。
  • 半双工:比单工先进一点,就是双方都能发信息,但同一时间则只能一方发信息。
  • 全双工:比半双工再先进一点,就是双方不仅都能发信息,而且能够同时发送。

注: TCP连接是全双工

TCP握手与挥手

四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。

  • 第一次挥手: Client端发起挥手请求,向Server端发送标志位是FIN报文段,设置序列号seq,此时,Client端进入FIN_WAIT_1状态,这表示Client端没有数据要发送给Server端了。
  • 第二次分手:Server端收到了Client端发送的FIN报文段,向Client端返回一个标志位是ACK的报文段,ack设为seq加1,Client端进入FIN_WAIT_2状态,Server端告诉Client端,我确认并同意你的关闭请求。
  • 第三次分手: Server端向Client端发送标志位是FIN的报文段,请求关闭连接,同时Client端进入LAST_ACK状态。
  • 第四次分手 : Client端收到Server端发送的FIN报文段,向Server端发送标志位是ACK的报文段,然后Client端进入TIME_WAIT状态。Server端收到Client端的ACK报文段以后,就关闭连接。此时,Client端等待2MSL的时间后依然没有收到回复,则证明Server端已正常关闭,那好,Client端也可以关闭连接了。

为什么连接的时候是三次握手,关闭的时候却是四次握手?
建立连接时因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。所以建立连接只需要三次握手。
由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式。这就意味着,关闭连接时,当Client端发出FIN报文段时,只是表示Client端告诉Server端数据已经发送完毕了。当Server端收到FIN报文并返回ACK报文段,表示它已经知道Client端没有数据发送了,但是Server端还是可以发送数据到Client端的,所以Server很可能并不会立即关闭SOCKET,直到Server端把数据也发送完毕。当Server端也发送了FIN报文段时,这个时候就表示Server端也没有数据要发送了,就会告诉Client端,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

针对UDP编程


UDP是没有连接的,所以不需要三次握手,也就不需要调用listen和connect,但是UDP的交互仍然需要IP地址和端口号,因而也需要bind。对于UDP来讲,没有所谓的连接维护,也没有所谓的连接的发起方和接收方,甚至都不存在客户端和服务端的概念。大家都是客户端,也同时是服务端。只要有一个socket,多台机器就可以任意通信,不存在哪两台机器是属于一个连接的概念。因此,每一个UDP的socket都需要bind,。每次通信时,调用 sendto 和 recvfrom,都要传入 IP 地址和端口。


network protocol
https://chixiaowen.github.io/2023/03/14/network/
Author
Chixiaowen
Posted on
March 14, 2023
Licensed under