TCP/IP协议族基本知识

摘要:
OSI和TCP/IP分层模型OSI模型是国际化标准组织定义的七层模型,和现行的TCP/IP协议族是等价的。OSI的顶上三层等价于TCP/IP协议族的应用层。OSI底下两层等价于TCP/IP协议族中随系统提供的设备驱动程序和硬件。基于套接字的编程所处的位置是TCP/IP协议族应用层和传输层的交界处。TCP正常连接建立和终止所对应的状态客户机创建套接字,与服务器连接,成功后和内核TCP协议栈进行读写交互来收发信息。

常见的网络拓扑

两台主机通信的过程:应用进程产生消息,经由主机的 TCP/IP 协议栈发送到局域网(LAN),最后经过广域网(目前最大的广域网的因特网)中的网络设备(路由器)传给目的主机所在的局域网(LAN),最后经过局域网(LAN)将报文传送个目的主机,经由主机 TCP/IP 协议栈处理,将消息递交给目的应用程序。网络拓扑如下:

TCP/IP协议族基本知识第1张

图中路由器是网络中的架构设备,是因特网的组成部分。

OSI和TCP/IP分层模型

OSI (Open System Interconnection)模型是国际化标准组织定义的七层模型,和现行的 TCP/IP 协议族是等价的。OSI 的顶上三层等价于 TCP/IP 协议族的应用层(典型的有 Web、Telnet、FTP 等应用)。 OSI 底下两层等价于 TCP/IP 协议族中随系统提供的设备驱动程序和硬件。

TCP/IP协议族基本知识第2张

基于套接字的编程所处的位置是 TCP/IP 协议族应用层和传输层(TCP、UDP)的交界处。

为什么套接字提供的是从 OSI 模型的顶上三层(TCP/IP 协议族的应用层)进入传输层的接口?两个原因如下:

顶上三层处理具体网络应用的所有细节,却对通信细节了解很少;底下四层对具体网络应用了解不多,却处理所有的通信细节。

顶上三层通常构成所谓的用户进程,底下四层却通常作为操作系统内核的一部分提供(Unix 与其他现代操作系统都提供分隔用户进程与内核的机制)由此可见,第4层和第5层之间的接口是构建 API 的自然位置

TCP状态转移

TCP 是一个有限状态机,TCP 为一个连接定义了11种状态,并且 TCP 规则规定如何基于当前状态及该状态下所连接的分组从一个状态转换到另一个状态。例如:客户机的 TCP 连接状态经历的过程如下:首先处于起始点(CLOSE)状态,然后客户机主动打开,会转移到 SYN_SENT 状态。如果客户机接收到来自服务器的 SYN,ACK 报文,则发送 ACK 确认消息,并转移至 ESTABLISHED 状态,就可以收发消息了。

TCP/IP协议族基本知识第3张

粗实线表示通常的客户状态转换,用粗虚线表示通常的服务器状态转换。

我们用上图来显示在正常的 TCP 连接的建立与终止过程中,客户与服务器所经历的不同状态。

1、服务器端首先执行 LISTEN 原语进入被动打开状态( LISTEN ),等待客户端连接;

2、当客户端的一个应用程序发出 CONNECT 命令后,本地的 TCP 实体为其创建一个连接记录并标记为 SYN SENT 状态,然后给服务器发送一个 SYN 报文段;

3、服务器收到一个 SYN 报文段,其 TCP 实体给客户端发送确认 ACK 报文段同时发送一个 SYN 信号,进入 SYN RCVD 状态;

4、客户端收到 SYN + ACK 报文段,其 TCP 实体给服务器端发送出三次握手的最后一个 ACK 报文段,并转换为 ESTABLISHED 状态;

5、服务器端收到确认的 ACK 报文段,完成了三次握手,于是也进入 ESTABLISHED 状态。

在此状态下,双方可以自由传输数据。当一个应用程序完成数据传输任务后,它需要关闭 TCP 连接。假设仍由客户端发起主动关闭连接。

1、客户端执行 CLOSE 原语,本地的 TCP 实体发送一个 FIN 报文段并等待响应的确认(进入状态 FIN WAIT 1 );

2、服务器收到一个 FIN 报文段,它确认客户端的请求发回一个 ACK 报文段,进入 CLOSE WAIT 状态;

3、客户端收到确认 ACK 报文段,就转移到 FIN WAIT 2 状态,此时连接在一个方向上就断开了;

4、服务器端应用得到通告后,也执行 CLOSE 原语关闭另一个方向的连接,其本地 TCP 实体向客户端发送一个 FIN 报文段,并进入 LAST ACK 状态,等待最后一个 ACK 确认报文段;

5、客户端收到 FIN 报文段并确认,进入 TIMED WAIT 状态,此时双方连接均已经断开,但 TCP 要等待一个 2 倍报文段最大生存时间 MSL,确保该连接的所有分组全部消失,以防止出现确认丢失的情况。当定时器超时后, TCP 删除该连接记录,返回到初始状态( CLOSED )。

6、服务器收到最后一个确认 ACK 报文段,其 TCP 实体便释放该连接,并删除连接记录,返回到初始状态( CLOSED )。

TCP 的分组交换流程

站在 Linux 系统编程的角度来看 TCP 协议栈的状态转移分为三个阶段讲解:

三次握手建立连接阶段:首先由客户机调用 connect 函数发起主动连接,激发 TCP 协议栈发送 SYN 报文;服务器协议栈收到该 SYN 报文后, 发送给处于 LISTEN 状态的套接字,应用进程通过 accept 函数激发 TCP 协议栈发送 SYN+ACK 报文,接受连接请求;客户机收到服务器 SYN+ACK 报文后发送确认 ACK 报文,进入 ESTABLISHED 状态;当服务器收到客户机 ACK 报文后,也进入ESTABLISHED 状态,accept 函数返回。

数据传输阶段:这一阶段主要的任务就是通过调用 read,write 函数收发消息。

四次挥手断开连接阶段:客户端发送一个 FIN,用来关闭客户到服务器的数据传送;服务器收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号;服务器关闭与客户端的连接,发送一个FIN给客户端;客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

TCP正常连接建立和终止所对应的状态

TCP/IP协议族基本知识第4张

客户机创建套接字(socket),与服务器连接(connnect),成功后和内核 TCP 协议栈进行读写交互(write、read)来收发信息。

服务器创建套接字(socket)、绑定到特定的服务器 IP 地址和端口(bind),然后将其设置为监听客户请求的状态(listen)。如果有来自客户机的请求,则接收连接(accept),成功后和内核 TCP 协议栈进行读写交互(write、read)来收发信息。

免责声明:文章转载自《TCP/IP协议族基本知识》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇android通知栏Notification点击,取消,清除响应事件数组概述和特点下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

初入spring boot(五 )websocket

一、广播式   广播式即服务端有消息时,会将消息发送给所有连接了当前endpoint的浏览器   1.配置websocket,需要在配置类上使用@EnableWebSocketMessageBroker开启websocket支持,并通过继承AbstractWebSocketMessageBrokerConfigurer类,重写其方法来配置websocket...

LwIP协议栈(2):网络接口

  在LwIP中,物理网络硬件接口结构保存在一个全局链表中,它们通过结构体中的 next 指针连接。 struct netif { /// pointer to next in linked list */ struct netif *next; /// IP address configuration in network byte o...

rabbitmq进阶

目录 消息传递 过期时间(TTL) 死信队列 延迟队列 优先级队列 RPC实现 持久化 生产者确认 消费端要点 消息传输保障 消息传递 mandatory mandatory=true,如果交换器无法根据自身的类型和路由键找到一个符合条件的队列,RabbitMQ会调用 Basic.Return 命令将消息返回给生产者,生产者通过调用 chann...

端口扫描工具nmap

nmap 使用介绍 nmap是目前为止最广为使用的国外端口扫描工具之一。我们可以从[url]http://www.insecure.org/[/url]进行下载,可以很容易的安装到Windows和unix操作系统中,包括mac os x(通过configure、make 、make install等命令)也可以直接从http://www.insecure....

LVS分析

概述 LVS是章文嵩博士十几年前的开源项目,已经被何如linux kernel 目录十几年了,可以说是国内最成功的kernle 开源项目, 在10多年后的今天,因为互联网的高速发展LVS得到了极大的应用, 是当今国内互联网公司,尤其是大型互联网公司的必备武器之一, 从这一点上来说,LVS名副其实。搞了这么多年linux 网络开发维护, 由于一直偏通信方向,...

CRLF注入原理

CRLF 指的是回车符(CR,ASCII 13, ,%0d) 和换行符(LF,ASCII 10, ,%0a),操作系统就是根据这个标识来进行换行的,你在键盘输入回车键就是输出这个字符,只不过win和linux系统采用的标识不一样而已。 在HTTP当中HTTP的Header和Body之间就是用两个crlf进行分隔的,如果能控制HTTP消息头中的字符,注入一些...