linux网络编程系列-TCP/IP模型
### OSI:open system interconnection ###
开放系统互联网模型是由ISO国际标准化组织定义的网络分层模型,共七层
1. 物理层:物理定义了所有电子及物理设备的规范,数据传输单位为比特(b),本层定义规范有EIA/TIA RS-232、RJ-45等,实际是由设备如网卡等
2. 数据链路层:对物理层收到的比特流进行数据成帧。提供可靠的数据传输服务,实现无差错数据传输。本层数据单位为帧(frame)。本层规范SDLC、PPP、STP等,使用设备如switch交换机等
3. 网络层:将各个子网之间的数据进行路由选择,分组与重组。本层数据传输单位为数据包(packet)。属于本层的规范有IP、IPX、IGMP等。使用设备如路由器
4. 传输层:提供可靠的数据传输服务,检测路由器丢弃的包,然后产生一个重传请求,能够将乱序收到的数据包重新排序
5. 会话层:管理主机之间会话过程,包括会话建立、终止和会话过程中的管理,传输单位(SPDU)
6. 表示层:对网络传输的数据进行变换,使得多个主机之间传送的信息能够互相理解,包括数据的压缩、加密、格式转换等,传输单位(PPDU)
7. 应用层:应用层与应用程序界面沟通,以达至展示给用户的目的,在此常见的协议有:HTTP、HTTPS、FTP、SSH、POP等,传输单位(APDU)
### TCP/IP四层模型 ###
1. 链路层:类似OSI中物理层和数据链路层的集合,主要规范:ARP、RARP
2. 网络层:类似OSI中网络层,主要规范:IP、ICMP、IGMP
3. 传输层:类似OSI中传输层,主要规范:TCP、UDP
4. 应用层:类似OSI中会话层、表示层和应用层的集合,主要协议例如:ftp、telet、qq等
#### 端口 ####
1. 众所周知端口(Well Known Ports):从0到1023,这些端口由IANA分配和控制,通常这些端口明确表明了某种服务,例如:21端口为ftp服务
2. 注册端口:从1024到49151,这些端口不受IANA控制,但有IANA登记并提供使用情况清单,许多服务绑定于这些端口,这些端口同样用于许多其他的目的,例如:1433 Microsoft SQL服务端口
3. 动态或私有端口:49152到65535,IANA不管这些端口,实际上,机器通常从1024起分配动态端口,但也有例外,SUN的RPC端口从32768开始
#### 协议说明、封装、分用 ####
MTU:以太网最大数据传输单元
ICMP:传递差错信息、时间、网络信息等控制数据
ARP:地址解析协议,映射IP地址到MAC地址
RARP:地址解析协议,映射MAC地址到IP地址
封装: 应用层->链路层 (IP地址转换为MAC地址)
分用: 链路层->应用层 (MAC地址转换为IP地址)
#### 主机A ping 主机B 数据在网络中的传输说明 ####
1. 应用程序判断ping的是主机名还是IP地址,如果是主机名会调用gethostbyname()解析主机B,将主机名转换成一个32位的IP地址,这个过程叫做DNS域名解析
2. ping程序向目标IP地址发送一个ICMP的ECHO包
3. 将目标主机的IP地址转换为48位硬件地址,在局域网内发送ARP请求广播,查找主机B的硬件地址
4. 主机B的ARP协议层接收到主机A的ARP请求后,将本机的硬件地址填充到应答包,发送ARP应答到主机A
5. 发送ICMP数据包到主机B
6. 主机B接收到主机A的ICMP包,发送响应包
7. 主机A接收到主机B的ICMP响应包
### IP数据报格式 ###
1. 版本:IPv4字段值为4,IPv6字段值为6
2. 首部长度:以32位的字为单位,该字段长度为4位,最大值为15,所以首部长度最大为60个字节
3. 总长度:该字段长度为16位,以字节为单位,该字段长度包含IP的头部和数据部分,IP数据报最大可达65535个字节
4. 标识:16位标识,用来标识一个IP包,每发送一个此值会加1
5. TTL(TIme To Live):表示数据报最多可经过的路由器的数量,每经过一个路由器,TTL值减1,减为0时丢弃,并发送ICMP报文给源主机,TTL可以避免数据报在路由器之间不断循环
6. 协议类型:表示IP层上承载的是哪个高级协议,协议栈知道交给哪个层的协议处理,1 ICMP 2 IGMP 6 TCP 17 UDP
7. 网际校验和:接收方接收到发送方的数据后按照校验算法对数据进行校验,检验数据在传输过程中是否发生错误
### TCP报文格式 ###
1. 源端口号与目的端口号:源端口号和目的端口号,加上IP首部的源IP地址和目的IP地址唯一确定一个TCP连接
2. 序号:序号表示在这个报文段中的第一个数据字节序号
3. 确认号:仅当ACK标志为1时有效,确认号表示期望收到的下一个字节的序号
4. 头部长度:4位 ,TCP头部最多60个字节
5. 保留位:6位,必须为0
6. 6个标志位:URG-紧急指针有效、ACK-确认序号有效、SYN-发送连接的同步序号、FIN-表示要终止一个连接、RST-连接重置、PSH-接收方将这个报文交给应用层
7. 窗口大小:通过窗口大小来达到流量控制
8. 校验和:对TCP头与数据进行校验
### TCP连接建立三次握手 ###
TCP A 发送SYN a->TCP B //A请求建立连接
TCP B 发送SYN b ACK a+1 ->TCP A //确认收到请求,并请求A回复
TCP A 发送ACK b+1 ->TCP B //对B的请求进行回复
### TCP连接终止的四次握手 ###
TCP A 发送FIN x ACK y->TCP B //A请求终止连接
TCP B 发送ACK x+1 ->TCP A //B收到终止请求并回复给A
TCP B 发送FIN y ACK x+1->TCP A //B根据A的终止请求也请求终止连接
TCP A 发送ACK y+1->TCP B //A收到终止请求并回复给B
### 滑动窗口协议(流量控制) ###
1. 通告接收窗口:预防应用程序发送的数据超过对方的缓冲区,接收方使用的流量控制
2. 拥塞窗口(cwnd):预防应用程序发送的数据超过网络所能承受的能力,发送方使用的流量控制
3. 发送窗口取两者较小值
4. 慢启动阈值(ssthresh:slow start threshold)
5. 慢启动阶段:cwnd从1开始按指数增长直到ssthresh
6. 拥塞避免阶段:cwnd按线性增长,直到拥塞,将cwnd=1,ssthresh减半
linux网络编程系列-TCP/IP模型的更多相关文章
- 【Linux 网络编程】TCP/IP四层模型
应用层.传输层.网络层.链路层 链路层:常用协议 ARP(将物理地址转化为IP地址) RARP(将IP地址转换为物理地址) 网络层(IP层):重要协议ICMP IP IGMP 传输层:重要的协议TCP ...
- Linux网络编程系列-TCP传输控制
滑动窗口(sliding window) 滑动窗口是用于流量控制的,发送端根据接收端的处理能力发送数据,不至于造成过多的丢包. 是发送方和接收方间的协调,对方的接收窗口大小就是自己的发送窗口大小. 在 ...
- Linux网络编程系列-TCP编程实例
实例: client #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #inc ...
- 嵌入式linux的网络编程(1)--TCP/IP协议概述
嵌入式linux的网络编程(1)--TCP/IP协议概述 1.OSI参考模型及TCP/IP参考模型 通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著 ...
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...
- 【转载】[基础知识]【网络编程】TCP/IP
转自http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=27043 [基础知识][网络编程]TCP/IP iooops 胖友们楼主我又 ...
- 【Linux 网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数:对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...
- 2015-07学习总结——网络编程(TCP/IP)
之前学习的主要内容是单机上的处理,比如编程语言.游戏编程.数据库.多媒体编解码.其实对网络也有些接触,比如WWW.HTTP.UDP/TCP.RTP.RTMP.SNMP.FTP.单播组播.Telnet. ...
- 【网络编程】TCP/IP、UDP、网络概…
计算机刚刚发明出来的时候,两台计算机之间是无法通信的,为了使计算机之间能够进行数据的交流,制定了OSI(Open SystemInterconnection)开放系统互联模型,而TCP/IP(我们所使 ...
随机推荐
- ISE中FPGA的实现流程
一.ISE实现的步骤 在综合之后,我们开始启动FPGA在ISE中的实现过程,整个过程包括以下几个步骤: 1.Translate ...
- Oozie 配合 sqoop hive 实现数据分析输出到 mysql
文件/RDBMS -> flume/sqoop -> HDFS -> Hive -> HDFS -> Sqoop -> RDBMS 其中,本文实现了 使用 sqoo ...
- 仿造vue-resource的formdata传对象
众插件不支持同步,也是没办法的事情,具体为啥就不分析了,确实搞不懂. 一直用vue-resource的post,觉得很舒服. 然,没办法只能仿造一个,自己提供一个同步方法 几个点先摆清楚 1. .th ...
- BZOJ 1968 [Ahoi2005]COMMON 约数研究:数学【思维题】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1968 题意: 设f(x) = x约数的个数.如:12的约数有1,2,3,4,6,12,所以 ...
- Git 使用 粗糙记录
版本控制应该是每一个开发人员应该会的东西,奈何,学校没有学习,随着写代码的时间的加长,越来月觉得版本控制的必要性了. 记得在实习的公司,同一痛的都是SVN. 至于GIt和SVN的区别,直接看连接 ht ...
- 第十七篇 Python函数之闭包与装饰器
一. 装饰器 装饰器:可以拆解来看,器本质就是函数,装饰就是修饰的意思,所以装饰器的功能就是为其他函数添加附加功能. 装饰器的两个原则: 1. 不修改被修饰函数的源代码 2. 不修改被修饰函数的调用方 ...
- Lua工具类
1.打印table --一个用以打印table的函数 function print_r (t, name) print(pr(t,name)) end function pr (t, name, in ...
- go 语言模拟百度登录
1.参考网上Python的例子自己写了一个go语言的.这个仅供学习技术参考,为了方便有部分参数直接phantomjs执行js获取,代码基本都有注释,测试打印没有删除,还请见谅! 2.本文参考http: ...
- Nginx 配置 HTTPS自签名证书
工具: OpenSSL ssl的开源实现,几乎实现了市面上所有的加密 libcrypto: 通用加密库, 任何软件要实现加密功能 链接调用这个库 libssl: TLS/SSL 加密库 openssl ...
- pandas DataFrame的修改方法
pandas DataFrame的增删查改总结系列文章: pandas DaFrame的创建方法 pandas DataFrame的查询方法 pandas DataFrame行或列的删除方法 pand ...