常见的网络拓扑

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

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

OSI和TCP/IP分层模型

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

基于套接字的编程所处的位置是 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 连接的建立与终止过程中,客户与服务器所经历的不同状态。

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正常连接建立和终止所对应的状态

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

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

TCP/IP协议族基本知识的更多相关文章

  1. linux高性能服务器编程 (一) --Tcp/Ip协议族

    前言: 在学习swoole入门基础的过程中,遇到了很多知识瓶颈,比方说多进程.多线程.以及进程池和线程池等都有诸多的疑惑.之前也有学习相关知识,但只是单纯的知识面了解.而没有真正的学习他们的来龙去脉. ...

  2. TCP/IP知识总结(TCP/IP协议族读书笔记二)

    接下来,总结一下网络层的协议,IP,ARP,RARP,ICMP,IGMP.当我们在网络传输的过程中,把分组交付到主机或路由器需要两级地址:物理地址和逻辑地址.而且我们需要能够把物理地址映射成为相应的逻 ...

  3. TCP/IP知识总结(TCP/IP协议族读书笔记一)

    一.简述TCP/IP协议 Transmission Control Protocol/Internet Protocol的简写,即传输控制协议/互联网互联协议,又名网络通信协议.是Internet最基 ...

  4. TCP/IP协议族——IP工作原理及实例具体解释(上)

     IP协议具体解释 本文主要介绍了IP服务特点,头部结构,IP分片知识,并用tcpdump抓取数据包.来观察IP数据报传送过程中IP的格式,以及分片的过程. IP头部信息:IP头部信息出如今每一个 ...

  5. iOS的TCP/IP协议族剖析&&Socket

    原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有S ...

  6. Android网络编程系列 一 TCP/IP协议族

    在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...

  7. TCP/IP协议原理与应用笔记10:TCP/IP协议族

    1. 协议族视图如下:(这里我们列举重要的,并不是所有的) (1)网络接入层(数据链路层 和 物理层): 通过接入的物理网络的 功能 和 覆盖范围 进行分析划分为: •LANs :局域网(Local ...

  8. 服务器编程入门(1)TCP/IP协议族

    问题聚焦: 简单地梳理一下TCP/IP各层的功能和常用协议 详细了解ARP(数据链路层)和DNS(应用层)协议的工作原理 1 TCP/IP协议族体系结构 数据链路层:     职责:实现网卡接口的网络 ...

  9. TCP/IP协议族(一) HTTP简介、请求方法与响应状态码

    接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的.接下来的几篇博客都是关于TCP/IP协议族的,本篇博客就先简单 ...

随机推荐

  1. 7、VUE事件

    1.事件处理 Vue.js使用v-on指令监听DOM事件来触发JS回调函数. V-on: 缩写为 @ 事件回调函数可以传入$event这个事件对象. 2.事件修饰符 在事件处理程序中调用event.p ...

  2. C#读写设置修改调整UVC摄像头画面-曝光

    有时,我们需要在C#代码中对摄像头的曝光进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...

  3. Java基础篇(中)

    4.Java 关键字 下面列出了 Java 关键字.这些保留字不能用于常量.变量.和任何标识符的名称. 类别 关键字 说明 访问控制 private 私有的 protected 受保护的 public ...

  4. Mysql之索引(六)

    1.思考 在图书馆是怎么找到一本书的? 一般的应用系统对比数据库的读写比例在10:1左右(即有10次查询有1次写操作),而且插入操作和更新操作很少出现性能问题. 遇到最多,最复杂的还是一些复杂的查询操 ...

  5. Mycat分布式数据库架构解决方案--Mycat实现数据库分表

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 准备工 ...

  6. 【转载】C#中使用Insert方法往ArrayList集合指定索引位置插入新数据

    ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,在ArrayList集合操作过程中,可以使用ArrayList集合类的I ...

  7. 英语orientaljasper鸡血石orientaljasper单词

    鸡血石(orientaljasper),是辰砂条带的地开石,因鲜红色似鸡血的辰砂(朱砂)而得名.鸡血石含有辰砂(朱砂).石英.玉髓35%-45%.磁铁矿.赤铁矿6%-12%.辰砂约5%-8%. 鸡血石 ...

  8. vim巧妙用法

    1. 块复制 按ctrl+v键,编辑框最下方将出现"可视 块"字样 使用方向键移动光标,选择矩形区域内的文字 y 键复制文本: d 键剪切文本:p 键粘贴文本 按shift+v键, ...

  9. vue 指令中el 的 parentNode 为空的问题

    在项目中,突然发现在用vue指令的时候,发现元素el的父元素parentNode变成了null. 代码: if (el.parentNode && !Vue.prototype.$_h ...

  10. Jmeter CSV参数带汉字处理

    问题1:请求参数中有汉字,在windows上调测压测没有问题,直接把参数文件上传到linux 服务器上进行分布式压测时发现参数取出后为乱码,linux上后台查看文件也是乱码 处理方法: 初步想到是因为 ...