TCP/IP协议族基本知识
常见的网络拓扑
两台主机通信的过程:应用进程产生消息,经由主机的 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协议族基本知识的更多相关文章
- linux高性能服务器编程 (一) --Tcp/Ip协议族
前言: 在学习swoole入门基础的过程中,遇到了很多知识瓶颈,比方说多进程.多线程.以及进程池和线程池等都有诸多的疑惑.之前也有学习相关知识,但只是单纯的知识面了解.而没有真正的学习他们的来龙去脉. ...
- TCP/IP知识总结(TCP/IP协议族读书笔记二)
接下来,总结一下网络层的协议,IP,ARP,RARP,ICMP,IGMP.当我们在网络传输的过程中,把分组交付到主机或路由器需要两级地址:物理地址和逻辑地址.而且我们需要能够把物理地址映射成为相应的逻 ...
- TCP/IP知识总结(TCP/IP协议族读书笔记一)
一.简述TCP/IP协议 Transmission Control Protocol/Internet Protocol的简写,即传输控制协议/互联网互联协议,又名网络通信协议.是Internet最基 ...
- TCP/IP协议族——IP工作原理及实例具体解释(上)
IP协议具体解释 本文主要介绍了IP服务特点,头部结构,IP分片知识,并用tcpdump抓取数据包.来观察IP数据报传送过程中IP的格式,以及分片的过程. IP头部信息:IP头部信息出如今每一个 ...
- iOS的TCP/IP协议族剖析&&Socket
原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有S ...
- Android网络编程系列 一 TCP/IP协议族
在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...
- TCP/IP协议原理与应用笔记10:TCP/IP协议族
1. 协议族视图如下:(这里我们列举重要的,并不是所有的) (1)网络接入层(数据链路层 和 物理层): 通过接入的物理网络的 功能 和 覆盖范围 进行分析划分为: •LANs :局域网(Local ...
- 服务器编程入门(1)TCP/IP协议族
问题聚焦: 简单地梳理一下TCP/IP各层的功能和常用协议 详细了解ARP(数据链路层)和DNS(应用层)协议的工作原理 1 TCP/IP协议族体系结构 数据链路层: 职责:实现网卡接口的网络 ...
- TCP/IP协议族(一) HTTP简介、请求方法与响应状态码
接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的.接下来的几篇博客都是关于TCP/IP协议族的,本篇博客就先简单 ...
随机推荐
- English--不完全及物动词与授予动词
English|不完全及物动词与授予动词 动词在整个语法中都是占据着十分重要的角色.在五大句型中将动词分为五种:系动词.不及物动词.及物动词.不完全及物动词.授予动词.这篇主讲不完全及物动词和授予动词 ...
- 【译】Matplotlib:plotting
前言 本教程源于Scipy Lecture Notes,URL:http://www.scipy-lectures.org/ 本教程若有翻译不当或概念不明之处,请大家留言,博主及时更正,以便后来的用户 ...
- Android P(9.0) userdebug版本执行adb remount失败
[DESCRIPTION] 在android P版本上如果按照“FAQ18076 android 6.0 M userdebug版本执行adb remount失败”的做法在userdebug ...
- android.view.ViewRoot$CalledFromWrongThreadException 异常的解决方案
https://blog.csdn.net/vincent_czz/article/details/7070354 https://stackoverflow.com/questions/210141 ...
- SSM相关知识梳理面试
- DMA初识
功能 DMA可以在CPU不干涉的情况下,进行数据的搬移.例如:通过DMA来获取摄像头输出的像素数据,而占用少量CPU资源. DMAMUX DMAMUX负责数据的路由:将触发源绑定到特定的DMA通道,当 ...
- 摘jmeter安装之后如何汉化
下载完成后打开bin文件,选择jmeter.properties打开,搜索language,修改成zh_CN,汉化jmeter,记得去掉前面的#号,然后保存,修改完配置文件后需要重启jmeter 用的 ...
- 使用DocumentFormat.OpenXml操作Excel文件.xlsx
1.开始 DocumentFormat.OpenXml是ms官方给一个操作office三大件新版文件格式(.xlsx,.docx,.pptx)的组件:特色是它定义了OpenXml所包含的所有对象(たぶ ...
- RabbitMQ基本概念(三)-Centos7下安装RabbitMQ3.6.1
如果你看过前两章对RabbitMQ已经有了一定了解,现在已经摩拳擦掌,来吧动手吧! 用什么系统 本文使用的是Centos7,为了保证对linux不太熟悉的伙伴也能轻松上手(避免折在安装的路上),下面是 ...
- NumPy 之 ndarray 多维数组初识
why 回顾我的数据分析入门, 最开始时SPSS+EXCEL,正好15年初是上大一下的时候, 因为统计学的还蛮好的, SPSS傻瓜式操作,上手挺方便,可渐渐地发现,使用软件的最不好的地方是不够灵活, ...