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(我们所使 ...
随机推荐
- 『JavaScript』模仿接口
JavaScript中并没有内置的创建或实现接口的方法.这里将利用JavaScript的灵活性,来实现与接口意义相同的功能. 什么是接口? 接口的好处: 接口提供了一种用以说明一个对象应该具有哪些方法 ...
- MySQL高可用之MHA切换测试(switchover & failover)
Preface I've installed MasterHA yesterday,Now let's test the master-slave switch and failove ...
- 「Haskell 学习」一 环境与大致了解
感谢<Real World Haskell>在网上的免费发布,可以白嫖学Haskell这个久闻大名的函数式编程语言了. 本文运行于openSUSE Tumbleweed下,运行相关命令时留 ...
- 名片管理系统demo
# 定义一个列表,用来储存名片 def cardInfors(): # 打印功能提示 print('欢迎使用名片管理系统v6.6.6') print('1:添加一个名片') print('2:删除一个 ...
- Google无法离线安装扩展程序
Google无法离线安装扩展程序 Chrome插件伴侣 按照里面的使用说明使用 网盘地址: 链接: https://pan.baidu.com/s/1eXoLXyPNl2pfoPnArHq2Lg 提取 ...
- Java IO学习--输入输出流
一.Java IO的定义 I/O:输入输出系统,由输入输出控制系统和外围设备两部分组成. Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输 ...
- CCS Font 知识整理总结
总是搞不懂 CCS 中如何正确的使用字体,这下明白了. 1.什么是 font-face font-face 顾名思义,就是文字的脸.字体是文字的外在形式,就是文字的风格,是文字的外衣.比如行书.楷书. ...
- Failed loading D:\Program Files\phpStudy20161103\php\php-5.6.27-nts\ext\php_xdebug.dll
我用的是phpstudy 更新完composer php 切换composer的国内源的时候老是报找不到\php_xdebug.dll的错误, 原因是, 在php.ini 里面默写就是在Program ...
- [剑指Offer] 20.包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. [思路1]两个栈Stack和Min,Stack为当前栈中元素,Min为与Stack中元素一一对应的当前栈最小值. cl ...
- maven release版本重复上传error
A couple things I can think of: user credentials are wrong url to server is wrong user does not have ...