TCP/IP五层模型详解

应用层

HTTP:简单的明文传输的请求——响应协议

超文本传输协议,HTTP的实现从HTTP的数据结构HTTP的协议格式两个角度。

HTTP数据结构:

格式:分为四个部分,包括首行、头部、空行、正文

首行

包括请求行和响应行
请求行中包括请求方法URI以及协议版本
响应行包括处理结果

请求行:
请求方法:总共九种
get:获取实体资源,也可提交数据,放在URL中,但是由于URL有长度限制,数据长度有限,存在安全隐患。特殊:请求中没有正文
head:只获取头部不要正文,响应无实体,效果与GET类似
post:向服务器提交表单数据,包括用户名和密码,一般可以放在正文不易泄密。特殊:提交数据放在正文
put:客户端传给服务端,修改资源
delete:客户端传给服务端,删除资源

URI(只有资源路径,查询字符串,片段标识符)
协议版本:HTTP/版本号
0.9:最早,只能穿HTML,只有get一种请求方法,只支持短连接
1.0:规范了HTTP的格式,支持了GET、POST、HEAD更多的请求方法,加入缓存机制,协议只支持短连接,但是服务商支持长连接。后期支持长连接以及缓存控制
1.1:支持更多请求方法,性能提升,支持长连接和管线化传输,并优化了缓存机制。支持更多请求方法以及头部字段。
2.0:针对1.1的臃肿与性能进行改进,支持资源推送,多路复用,解决队头阻塞,采用二进制传输

响应行:协议版本、响应状态码,状态码描述,结尾:\r\n
响应状态码:用于表示针对本次请求的处理结果,
1XX:描述协商信息
100:继续,101:切换协议
2XX:表示正确处理
200:正确,2021创建,206:部分内容
3XX:本次请求重定向
300:多种选择,302:临时移动,301:临时移动
重定向的目的是为了在资源路径发生改变后,原链接依然可用
4XX:客户端请求错误
400:语法错误,403:拒绝,404:资源不存在
5XX:服务器错误
500:服务器内部错误,502:网关请求失败,
504:网关超时获取(代理服务器)
状态码描述:对状态码进行文字描述

头部

包括描述字段,由键值对组成,作为关于请求响应、正文的关键信息描述。
作用:用于描述请求、相应关键信息
通用头部:
HOST:网址
CONNET:keep-alive长连接 close短连接
Upgrade-Insecure-Requests:安全协议升级 1支持 0不支持
User-Agent:描述客户端的软件、系统信息
Accept:客户端告诉服务端可以处理的数据
Content-Length:解决http粘包问题
Content-type:决定正文的处理方式
Cookie/set-cookie:用于cookie控制
格式: key: val\r\n
key: val\r\n

区分cookie和session
cookie:保存在客户端的一些关键信息,用于实现http的通信状态维护
session:保存在服务端的客户端会话信息,用于解决cookie不安全问题

空行

包括\r\n,与头部最后一个结尾的\r\n组成两个空行作为区分头部和正文的标志

正文

需要传输的数据

浏览器的控制

连续发送请求、等待连续相应、通常会创建多个连接在多个线程或进程中进行请求

HTTPS

定义

HTTP+SSL安全协议
实现网络安全传输,数据不会被劫持监听
加密流程:身份验证+传输加密
身份验证:防止黑客伪装身份,身份篡改,采用CA认证,即第三方权威机构认证
传输加密:防止黑客监听,包括对称加密即就是加密解密使用同一种密钥,和非对称加密,也就是采用公钥加密,私钥解密,以及混合加密三种,HTTPS采用的是混合加密。
混合加密采用:先非对称协商出对称密钥,再用对称密钥进行加密解密

CA认证

第三方权威机构对通信双方的身份验证机制

SSL加密流程:

被验证的一方生成一对密钥,利用公钥在权威机构获得CA证书,证书包括被验证的一方的信息、权威机构信息以及公钥信息,再将CA证书发送给对端,对端解析后进行验证,通过验证后进行非对称加密,计算出对称密钥,最后利用对称密钥加密传输

混合对称加密过程:

发端经过公钥加密后发给收端,公钥里包括一个随机数和对称密钥列表,收端再将公钥加密后发给发端,这里的公钥包含了另一个随机数和对称密钥列表,双方根据两个随机数和对称密钥列表协商算出对称密钥。

对称:加解密密钥相同,效率高但是安全度低,密钥容易被劫持
非对称:公钥加密、私钥解密,安全度高但是加解密效率低

url

定义

统一资源定位符,即网址,用于唯一定位网络中某台主机上的某个资源

组成

协议://user:passwd@域名或ip:端口/请求资源在主机上的路径?键值对形式的查询字符串#标识符
查询字符串:提交给服务器的数据,有键值对组成,特殊字符需要转义:
注意: 1、IP地址也可以是域名
2、资源路径、查询字符串可能存在url编码:防止提交数据的特殊字符与url的特有字符造成歧义
urlencode:将特殊字符转16进制,并加上%。
urldecode:遇到%则将后边两个字符转换为数字,第一个数字乘以16加上第二个数字
3、查询字符串常用于GET请求的数据提交

自定制协议:程序员自己定义网络通信数据格式

注意:性能+调试
实现:结构体二进制序列化、json序列化
名词解释: 序列化:组织数据,将多个数据对象组织成为一个二进制数据串整体
反序列化:解析数据,将二进制数据串解析得到数据对象

DNS

域名->IP
域名服务器分类:根、顶级、二级
域名:顶级(地域、性质)、二级
DNS服务器解析流程:
查看缓存、查看host文件、本地DNS服务器
迭代查找、递归查找
问:浏览器输入URL后发生了什么?

传输层

UDP用户数据报协议

特点:
无连接:不建立连接,只用知道对方的地址信息
不可靠:无丢包检测
面向数据报:有最大长度限制

协议格式:
16位源端端口、16位对端端口、16位报文长度(报文最长64K)、16位校验和

影响:
报文过长->分包
应用层分包->报序管理
整条交付->recvfrom是缓冲区要求足够大

TCP传输控制协议

协议格式:

源端口(16)、目的端口(16)
序号(32)
确认序号(32)
首长度(4),保留(6),标志位(6):URG\ACK\PSH\RST\SYN\FIN,窗口大小(16)
校验和(16),紧急指针(16)
选项数据(16)

面向连接:确认双方都有数据收发能力

1、三次握手:先建立连接再通信,确保双方具有收发能力

①客户端向处于LISTEN状态的服务端发送SYN,客户端进入SYN_SENT,服 务端创建新套接字进入SYN_RCVD
②服务端向客户端发送ACK+SYN,客户端收到后进入ESTABLISHED
③客户端向服务端发送ACK,服务端收到后进入ESTABLISHED
自此双方成功建立连接可以相互通信

问:为什么一定是三次握手:
答:因为两次不安全:两次只能确定其中一方的手法能力,可能存在服务端和 客户端建立链接,但是客户端没能成功链接的情况。四次则没必要,因为 SYN ACK可以合在一个报文中同时发,因此三次足够。

问:三次握手失败如何处理:
答:发送失败有三种情况,
其一是客户端的SYN没有到达服务端,此时重发SYN,
第二种情况是服务端的SYN和ACK没有到达客户端,此时客户端重传SYN,而服务端需要重新建立新的套接字,发送RST,释放旧的套接字,目的是为了防止恶意链接。
第三种情况是服务端没收到客户端的ACK,此时服务端同样建立新的套接字,发送RST,释放旧的套接字,客户端重发SYN。
此操作是为了防止SYN泛洪攻击,即对方只发送SYN不进行ACK回复,大量占用套接字。此时在Linux编程中的listen函数就需要设置backlog,即最大连接数

2、四次挥手,链接断开需要主动方和被动方进行四次挥手才能结束链接

①主动方调用close()或shutdown -WR关闭写操作后进入FIN_WAIT状态向被动 方发送FIN,被动方进入CLOSE_WAIT状态
②被动方回复ACK,主动方收到后进入FIN_WAIT2状态。
③被动方调用close()或shutdown -WR关闭写操作后向主动方发送FIN,主动方 接收后进入TIME_WAIT状态。
④主动方向被动方发出ACK,被动方收到后进入CLOSED状态,而主动方会在 等待一段时间后,一般是2倍的MSL,即两倍报文最大生存周期后进入CLOSED 状态。

主动关闭方:FIN_WAIT1->FIN_WAIT2->TIME_WAIT->CLOSED
被动关闭方:CLOSED_WAIT->LAST_ACK->CLOSED

保活机制
tcpo服务端会在长时间没有通信的情况下,向客户端发送保活探测数据包,要求回复,连续多次不回复则认为连接断开

问:为什么一定是四次挥手
答:因为收到FIN只表示对方不再发送,不表示对方不再接收,有可能存在收 到FIN的时候还需要发送的情况,只有上层调用close或者shutdown之后,才 会发送FIN结束发送,因此收端的ACK和FIN不能同时发送。

问:一台主机上大量的CLOSE_WAIT,如何解决?
答:由于CLOSE_WAIT是被动方收到FIN后进行ACK回复后的状态,所以可能是代码中没有运行close关闭套接字导致。

问:TIME_WAIT的作用
答:TIME_WAIT指的是主动方收到FIN后,ACK回复后的状态,即第三次挥手,由于一旦第四次回收失败,被动方会重新进行第二次挥手,所以当主动方回复ACK后如果直接close关闭套接字,可能这是一旦启动一个新的客户端可能会刚好使用上一个关闭的套接字的端口信息。这是新的客户端会在刚登陆时收到之前的FIN。

问:重传数据对新建连接造成什么影响
答:首先保护新的套接字不让他用之前用过的地址、端口,其次防止原链接丢新连接产生影响。目的是为了保护客户端,因为服务端的IP和端口是固定的,客户端往往不固定。因此,TIME_WAIT等待两个MSL可以确保上次旧连接全部结束。

问:一台主机大量TIME_WAIT,如何解决?
答:因为TIME_WAIT指的是主动方最后一次发送ACK后产生的,所以大量的TIME_WAIT可能是在大量关闭套接字,比如客户端是爬虫主机。解决方法是,减小TIME_WAIT的等待时间,或者是设置套接字选项,开启地址服用,在Linux函数中采用setscokopt函数中的int level和int optname。

可靠传输

①面向连接,即收发端只有建立连接后才能传输
②确认应答机制,即丢包检测功能
③超时重传,即超时没有确认应答则重传数据包
④依靠协议中的序号和确认序号进行包序管理
⑤依靠协议中的校验和,用于校验数据的一致性

问:如何避免丢包?
答:丢包的情况有两种,一个是发端发送过多数据,导致接收方的缓冲区不足,数据溢出,第二个是传输进行到某一阶段网络质量突然变差,解决方案有:

①滑动窗口机制:
原理:接收方在收到数据后确认回复,通过调整协议中的窗口大小,影响发送方所能发送的数据大小,其中发送的数据必须小于等于接收端缓冲区的剩余空间。
实现:
窗口的移动,发送窗口、接收窗口,
发送窗口: 后延:是否收到确认应答
前沿:根据响应中的窗口大小移动
接收窗口: 后延:是否接受到了后沿数据
前沿:缓冲区的剩余空间大小
收发端维护一个收发窗口变量,其中发送窗口包含了发送端所能发送的数据大小和序号,窗口的后验包括起始发送的数据序号,收到ack后移动,前沿包括结束发送的数据序号根据窗口大小变化,前沿减去后沿一般小于等于对方回复的窗口大小。

②拥塞窗口机制:解决网络质量突然变差
原理:发端维护一个拥塞窗口,限制当前能发的数据量
拥塞窗口具有慢启动,快增长的特性,本质就是对当前网络状况进行一个检测

③性能挽回:由于采用可靠传输,导致性能存在一定丢失
A、快速重传协议,由于收端收到的并非一定是后沿数据,可能存在之前数据的丢失,所以每次收到一条数据都发一条后沿数据的重传请求,当发端收到三条相同的重传请求,则进行重传
B、捎带应答机制:将发送数据和确认回复放到一起进行发送
C、延迟应答机制:延迟确认回复,将窗口大小维持在一个稳定水平,保证传输的吞吐量不会降低
D、延迟发送机制:将数据在缓冲区堆积后,一次性发送,减小IO次数提高效率

面向字节流

可靠、有序、双向、基于连接和以字节为单位,不限制发送和接收的数据大小。
优点在于比UDP的整条交付更加灵活,
缺点在于存在粘包问题,将多条数据当作一条处理,
粘包的本质是TCP多条数据不作边界处理,
解决方案是在应用层进行边界处理:
比如以特殊字符作为间隔,缺点是要转义,
其次是要求数据定长,缺点是要分段,长度不够要补全,
采用TLC数据格式,即就是在应用层的头部加入数据长度信息,传输层先解析头部在截取正文,如HTTP就是这种。

二者区别

1、基于连接与无连接;
2、对系统资源的要求(TCP较多,UDP少);
3、UDP程序结构较简单;
4、流模式与数据报模式 ;
5、TCP保证数据正确性,UDP可能丢包;
6、TCP保证数据顺序,UDP不保证。

程序编写

UDP通信程序编写

客户端 (主动发送请求)

1、创建套接字
2、(绑定地址信息,不推荐,会导致只能有一个客户端登录),绑定的地址:发送端源端地址
3、向服务端发送数据
4、接收服务端响应
5、关闭套接字

服务端(被动接受数据)

1、创建套接字
2、接收客户端的数据
3、向客户端响应数据
4、关闭套接字

接口

socket bind sendto recvfrom close
htons htonl ntohs ntohl inet_addr inet _ntoa

TCP通信程序编写

客户端

1、创建套接字
2、绑定地址(不推荐)
3、向服务端发送和请求
4、收发数据
5、关闭套接字

服务端

1、创建套接字
2、绑定地址
3、开始监听
4、获取新建连接
5、通信
6、关闭套接字

接口

socket bind listen connet accept recv send close
htons htonl ntohs ntohl inet_addr inet_ntoa
注意:
1、listen第二个参数:服务器限制同一时间的客户端连接请求数
2、流程固定+接口阻塞特性,导致一个服务端只能与一个客户端通信一次
解决方案:多进程+多线程

网络层

IP协议

4位协议版本+4位报头长度+8位服务类型+16位数据长度+16位分片标识+3位标志+13位分片偏移+8位TTL+8位上层协议+16位校验和+32位源IP+32位对端IP

数据分片

1、上层所给的数据大于MTU会在网络层进行数据分片,分割成合适大小的分片分别在IP包头进行传输。
2、分片的数据在对端主机的网络层会进行分片重组

IP地址组成:网络号:网络的标识
主机号:主机在该网络中的标识

网络划分

早期: A:0.0.0.0~127.255.255.255 0~127
B:128.0.0.0~191.255.255.255 128.0~191.255
C:192.0.0.0~223.255.255.255 192.0.0~223.255.255
D/E:特殊
当前:早期+子网掩码
子网掩码: 控制主机号数量:子网掩码取反得到最大主机号
识别IP地址网络:子网掩码与IP地址相与得到网络号

特殊IP

0.0.0.0、255.255.255.255、127.0.0.1

公网与私网

公网:互联网;
私网:自组网,需要根据NAT/NAPT转换,作用:防止外部入侵,节约IP
私网地址:10.0.0.0、172.16.0.0172.31.255.255、192.168.0.0192.168.255.255

路由选择

根据路由表选择目标IP的下一跳地址

数据链路层

组成

对端mac地址、源端mac地址,上层协议类型、帧尾校验和

mac地址

uint87_t mac[6]

ARP

IP->MAC,介于网络和数链层之间

MTU的影响

TCP:mss根据mtu得到,mss=mtu-40,在传输层自动分段,不在网络层分片
UDP:只要数据小于64K-28即可进行传输,分片会在对端主机重组,一个片出问题,丢弃整个报文,需要程序员自己控制传输数据大小,减小分片概率

物理层

传输比特流的物理链路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值