网络知识点

1.网络的初步认识

1.1计算机网络

独立主机:原本的计算机数据都是相互独立的,用于单纯的计算;
主机互联:随着发展可以将多台主机互相连接,传输数据;
局域网:计算机的数量增多,通过交换机和路由器连接到一起;(交换机的作用主要用于记录主机的mac地址,无法进行动态的数据发配,路由器可以增加网络识别,发送给目标主机)
广域网:相比于局域网范围更广
互联网:用于国际性的广域网

IP地址:uint32_t(一个无符号4字节整数)作为网络通信中的主机标识,传输数据时,会将自己的地址以及目标地址(网络传输每条数据中都含有这俩个参数);
ipv4:uint32_t DHCP/NAT ipv6:推广较少,数据吞吐量极大;
端口号:uint16_t(无符号2个字节整数)用于标识进程,传输数据时该往哪个进程传输,一个端口可以对应一个进程,一个进程可以对应多个端口

协议:按照通用的标准进行数据传输,网络互联;
协议分层:OSI,TCP/IP
OSI应用层,表示层,会话层,传输层,网络层,链路层,物理层
TCP/IP
应用层:应用程序之间的沟通,HTTP(超文本传输协议),FTP(文件传输协议)等等
传输层:负责进程之间的数据传输,TCP/UDP
网络层:负责地址管理与路由选择,IP(通过ip地址标识主机,路由器负责规划传输路线)
链路层:负责相邻设备之间的数据传送和识别,网卡设备驱动/交换机/以太网协议
物理层:负责光/电信号的传输,网线/光纤/无线网电磁波等等

2.网络套接字

2.1UDP通信

2.1.1通信流程

服务端

  1. 创建套接字

    在内核中创建套接字;

  2. 绑定套接字

    在socket结构体中描述IP地址和端口号以及协议信息

  3. 接收信息

    告诉操作系统哪个地址端口的信息该交给我处理,操作系统如果接受到这个地址端口的数据,会放到对应的socket接受缓冲区中,接受数据即从缓冲区中取数据;

  4. 发送信息

    将数据1写入到socket发送缓冲区中,操作系统选择合适时间发送;

  5. 关闭套接字

    释放资源

客户端

  1. 创建套接字

  2. 绑定套接字

    在套接字绑定服务端地址信息,一般不主动绑定;

  3. 发送信息

    将数据放到socket发送缓冲区中,操作系统选择合适时间发送;若没有绑定地址,操作系统选择合适地址绑定

  4. 接收信息

  5. 关闭套接字

2.1.2接口实现

1.创建套接字

int socket(int domain , int type , int protocol)

参数解析

domain:地址域,不同的协议版本有不同的地址域 IPV4 – AF_INET;

type:套接字类型,(流式套接字SOCK_STREAM / 数据报套接字SOCK_DGRAM);

protocol:协议类型(传输层协议一般为IPPROTO_TCP / IPPROTO_UDP)

2.绑定套接字

int bind(int sockfd,struct sockaddr_in* addr,socket_t len);

参数解析
sockfd:套接字的操作句柄;

addr:需要绑定的地址信息;

len:需要绑定的地址长度;

struct sockadd_in
{
    sa_family sin_family;//地址域
    in_port sin_port;//端口号
    struct in_addr sin_addr//32为IP地址
}
struct in_addr
{
    in_addr_t  s_addr;//32位IPV4
}
    

示例:绑定实例化

bind(fd,sockaddr* addr,len)
if(addr->sa_family == AF_INET)
//绑定IPV4地址信息,按照IPV4sockarr_in进行解析
{}
else if(addr->sa_family == AF_INET6){}
//绑定IPV6地址信息,按照IPXV6进行解析
else if(addr->sa_family == AF_LOCAL)
    //绑定本地地址

3.接受数据–接受数据的同时,通过接受得知数据来源

ssize_t recvfrom(int sockfd, char* buf,int len ,int flag, struct sockaddr* peer_addr,socklen_t *addrlen)

参数解析

  1. sockfd:套接字操作句柄;

  2. buf:接受缓冲区;

  3. len:需要接收数据的长度;

  4. flag:操作选项标志位,默认为0,表示阻塞;

  5. peer_addr:发送的地址信息;

  6. addrlen:想要获取的信息长度以及实际长度;

  7. 返回值,成功返回接收的数据长度,失败返回-1;


4.发送数据

ssize_t sendto(int sockfd,char* data,int len,int flag,struct sockaddr* peer_addr,socklen_t addrlen);

参数解析

  1. sockfd:套接字操作句柄;
  2. data:要发送元素的首地址;
  3. len:需要发送地址长度;
  4. flag:默认为0,表示阻塞操作;
  5. peer_addr:接收方地址信息;
  6. addrlen:地址信息长度;
  7. 返回值:成功返回发送的数据字节长度,失败返回-1;

5.关闭套接字

int close(int fd);

2.2TCP通信

2.2.1通信流程

tcp通信:连接,可靠,面向字节流;

服务端

  1. 创建套接字;

    在内核中创建socket使进程与网卡建立联系;

  2. 绑定地址信息;

    发送数据,源端地址即是需要绑定的客户端地址

    接收数据,告诉系统数据应该放到本机;

  3. 开始监听;

    设置监听套接字,接收客户端的连接请求

  4. 获取新连接socket

    在新的套接字中与客户端进行通;

  5. 收发数据;

  6. 关闭套接字;

客户端

  1. 创建套接字;
  2. 绑定地址信息;
  3. 向服务器发起连接;
  4. 收发数据;
  5. 关闭套接字;
2.2.2接口实现

1.创建套接字

int socket(int domain,int type, int protocol)

参数解析

domain:地址域,不同的协议版本有不同的地址域 IPV4 – AF_INET;

type:套接字类型,(流式套接字SOCK_STREAM / 数据报套接字SOCK_DGRAM);

protocol:协议类型(传输层协议一般为IPPROTO_TCP / IPPROTO_UDP)


2.绑定套接字

int bind(int sockfd, struct sockaddr* addr,socklen_t len);

参数解析
sockfd:套接字的操作句柄;

addr:需要绑定的地址信息;

len:需要绑定的地址长度;

struct sockadd_in
{
    sa_family sin_family;//地址域
    in_port sin_port;//端口号
    struct in_addr sin_addr//32为IP地址
}
struct in_addr
{
    in_addr_t  s_addr;//32位IPV4
}
    

示例:绑定实例化

bind(fd,sockaddr* addr,len)
if(addr->sa_family == AF_INET)
//绑定IPV4地址信息,按照IPV4sockarr_in进行解析
{}
else if(addr->sa_family == AF_INET6){}
//绑定IPV6地址信息,按照IPXV6进行解析
else if(addr->sa_family == AF_LOCAL)
    //绑定本地地址

3.开始监听

listen(int sockfd,int backlog);

参数解析

sockfd:套接字操作句柄,表示将指定的套接字设置为监听状态;

backlog:同一时间的最大连接数;


4.获取新建连接

int accept(int sockfd,struct socksddr* cli_addr , socklen_t len);

参数解析

新建一个套接字,用于数据传输;


5.接收数据/发送数据

在tcp连接时已经标识了addr地址端口信息,此处不需要再次绑定;

ssize_t recv(int sockfd,char* buf,int len,int flag);
//默认阻塞,没有则数据等待,连接断开返回0,不再阻塞;
ssize_t send(int sockfd,char* data,int len,int flag);
//默认阻塞,缓冲区数据满了则等待,连接断开触发异常;

6.关闭套接字

int close(int sockfd);

7.客户端发起连接请求

int connect(int sockfd, struct sockaddr* srv_addr,int len);

参数解析

srv_addr:服务器的地址信息

注意:connect接口在sockfd中也会描述本机地址信息;

3.应用层

应用层:直面程序员的一层,由于应用程序都由程序员编写,应用层的协议都由程序员决定;

3.1http协议

http协议:超文本传输协议,–早期用来传输文本数据html,随着协议发展多元化,不限制格式;

URL:即统一资源定位器,俗称网址,可以在网络中标记定位一个资源;

3.1.1协议解析

格式

协议方案名称://认证用户名:认证密码@服务器IP地址:服务器处理进程端口/请求的资源路径?查询字符串#片段标识符

http://usename:password@www.baidu.com:80/index.helm?name=wanghao&age= 20#ch

服务器IP地址:看到的不一定是IP地址,也可能是一个域名<服务器的别名>,通过域名解析服务器就可以得到服务器IP地址;

服务器端口:web服务器默认http服务器端口是80端口,默认不显示;

请求资源路径:资源在服务器的路径,/即为http的根目录,但是只是一个服务器上的相对根目录,只是一个服务器的子目录;

查询字符串:字符串提交给服务器的数据,由key= val & val = key键值对组成;

  1. 查询字符串不能出现特殊字符,url中的特殊字符有自身含义,一旦有特殊字符,容易造成歧义;
  2. 若提交数据中包含特殊字符,则需要转义;

片段标识符:html中的一个标签id,直接跳转到页面的某个位置;

3.1.2协议格式
请求

首行

GET http://123.207.58.23/admin HTTP/1.1

请求方法:GET/POST/HEAD/PUT/DELETE/CONNECT/PATCH/OPTIONS/TRACE

GET–请求实体资源,也可以通过url中查询字符串向服务器提交数据–数据不安全–url有长度限制

POST–主要用于向服务器提交数据,提交的数据在正文中,较于GET,POST有正文;

HEAD–类似与GEYT/HEAD,head只响应头部,不需要响应正文;

URL:http://123.207.58.23/admin

协议版本:HTTP/1.1 — 0.9/1.0/1.1/2.0

  1. 0.9版本:http仅仅用于传输html数据,只支持GET方法,协议格式不完整;
  2. 1.0版本:正式规定了http协议格式,增加了多种请求方法,支持不同文件的数据流;
  3. 1.1版本:在1.0基础上加了请求方式,并且支持长连接,管线化传输;
  4. 2.0版本:采用二进制传输方式,支持多路复用,允许服务器主动推送消息;

短连接:http在基于传输层tcp实现通信,短连接是建立连接,发送请求得到响应即关闭连接;

长连接:一次可以发送多条消息;

请求头部

描述本次请求的关键字信息,由key:val键值对组成,\r\n结尾

key : val \r\n

Connection:控制长短连接

Cache-Control:缓存控制

User-Agent:客户端属性

Accept-描述自己所能接收的数据属性

Content-Length-描述正文长度

Content-Type描述正文数据类型
**Cookie:**早期http是短连接通信,是无状态协议,不会保存状态,每次访问都需要重新登录,引入Cookie,Cookie带有一些信息,持续在通信中描述客户端的通信状态,但是不够安全;

空行:

间隔头部与正文,\r\n,接收俩个\r\n时,认为头部结束;

正文:

提交给服务器的数据;


服务器响应

首行

HTTP/1.0 303 See other

包含三要素,以空间作为间隔,\r\n作为结尾;

解析

协议版本0.9/1.0/1.1/2.0

响应状态码:本次请求服务器做出的响应

1XX:描述信息

2XX:表示本次请求处理完毕 如:200

3XX:重定向,表示你请求的资源在另一个地方,要求客户端访问 如:301-永久 302:暂时重定向

4XX:表示客户端请求出错 如:404访问资源不存在

5XX:表示服务器错误 500:服务器1内部错误 502:无效的响应 504-代理请求超时

头部:关于本次响应的关键字端描述信息

关于本次响应一些关键字段的描述,以键值对的形式存在,以\r\n为结束标识;
Transfer-Encoding:正文实体传输方式/Expires-缓存过期时间/Location-3xx重定向的位置/
Set-Cookie–服务器通过set-cookie向客户端发送传递信息,会被保存在客户端浏览器的cookie文件中;
Session–会话,服务端会为每个登录客户端的创建会话,在服务端描述会话信息,(客户的身份信息,状态信息),保存在服务端,可以通过cookie返回给客户端Session ID,客户端每次通信都会通过cookie带上自己的Session ID;
cookie和Session的区别
cookie是保存在客户端的的数据,用于持续与服务端进行信息传递的手段;
session是一种会话控制,服务器保存的会话信息包括客户端的身份状;

3.2https协议

https协议:是http基于SSL加密的应用层协议

3.2.1SSL加密过程
  1. 客户端对服务器发起请求,连接到服务器的端口后,发送一个随机值A与加密算法;
  2. 服务端收到后会响应客户端,回复一个随机值B与加密算法;
  3. 然后服务端会发送给客户端一个证书<自定义/CA证书,证书是一对密钥与公钥>,传送给客户端的证书里面包含公钥;
  4. 客户端解析证书,由客户端TLS完成,如果公钥没有问题,会产生一个随机值(预主密钥);
  5. 然后客户端会通过随机值AB以及预主密钥组装出一个会话密钥,通过证书传输密钥加密会话密钥;
  6. 传送加密信息,使用会话密钥,服务端通过证书密钥解析出来随机值AB,以及预主密钥;
  7. 然后服务端使用随机值AB与预主密钥组装出预主密钥,与客户端相同的会话密钥;
  8. 然后客户端与服务端互相发送信息,验证是否可以正常接收加密信息;

解析过程转载

4.传输层

传输层:传输层负责应用程序之间的数据传输(通过端口的描述–描述哪俩个进程在进行通信)

4.1udp协议

**UDP:**无连接,不可靠,面向数据报;

UDP协议格式

在这里插入图片描述

特性解析

无连接:不需要建立连接,只要知道对方的地址信息就可以直接发送数据;

不可靠:udp传输在传输层不保证数据安全有序的到达对端,需要程序员在应用层进行包序管理;

面向数据报: 有最大限制的传输方式–取决于数据长度,因为长度字段只有16位,因此数据报总长度不能大于64k,也就是sendto接口给予数据长度不能大于64k-8(报头占8字节);

udp通信在报头中确定了数据报长度,因此udp的数据的是完整是发送一个单位长度

发送:sendto给予的数据放到发送缓冲区后,直接封装到头部进行发送;

接收:recvfrom总是只能接收一条完整的数据,不会出现接收半条或者不完整的情况;

因此recvfrom的缓冲区要足够大,若小于一条数据长度,则报错;

4.2tcp协议

tcp协议:面向连接,可靠传输,面向字节流;

在这里插入图片描述

4.3tcp/udp解析
4.3.1为什么tcp三次握手:

答:两次不安全,四次没有必要;

  1. 客户端发送SYN后服务器会回复ACK指令,如果SYN消息延迟发送,客户端发送多次SYN,则都会连接成功,会造成资源浪费;
  2. 若客户端发送SYN后就退出,则会建立连接,浪费资源;(TCP具有保活机制)
  3. 3次就可以保证安全,4次会浪费资源;
4.3.2为什么要四次挥手

答:因为FIN发送命令后只可以保证不再发送数据,不代表不再接收数据,所以在等对方不再发送数据后发送再次发送FIN命令,保证安全性;

4.3.3TIME_WAIT的作用

答:假设最后一次的ACK丢失,超时后被动关闭方会再发送一个FIN,假设不经过TIME_WAIT就直接释放,可能有新的客户端与之前的地址信息一致,对新连接造成影响,新启动的客户端若发送SYN请求,产生错误发送RST重置连接报文;因此若关闭方不经过等待直接释放就可能对新连接造成影响,一般等待2个MSL时间—MSL报文最大生命周期

4.3.4TCP三次握手失败服务器如何处理
  1. 没有收到SYN,不需要做任何事;
  2. 回复了SYN+ACK但是长时间没有响应,超时会发送RST重置报文,释放资源;
4.3.5一台主机出现大量的TIME_WAIT是什么原因

答:说明主动关闭了大量的连接,常见于一些爬虫服务器,可以调整TIME_WAIT的时间;

4.3.6一台主机大量出现了CLOSE_WAIT是什么原因

答:CLOSE_WAIT是服务端收到FIN的请求,可能是上次的断开连接时,close没有释放资源;

4.3.7tcp连接的保活机制

tcp通信中,若两端长时间没有数据传输,每隔一段时间,服务器会向客户端发送一个保活探测包,要求客户端进行回复,若长时间没有回复,则认为连接断开;

长时间没有数据往来,–默认为7200s–可以通过套接字选项配置;

每隔一段时间–默认为75s–可以配置,通过设置套接字选项配置;

连续多次无响应–默认为9次,可配置;

4.2.8解释tcp可靠传输
  1. 面向连接:需要经过3次握手;

  2. 确认应答机制:发送数据让对方进行确认回复,直到确认收到数据,使用序号与确认序号实现;

  3. 超时重传机制:发送数据超时后,认为数据丢失,会进行重新传输;

  4. 有序传输:通过序号/确认序号来实现数据的有序交付;

  5. 检测数据的一致性:通过校验和来校验数据的一致性,不一致则要求对方重传;

    seq:本条数据的起始序号;

    ack:接收的确认信号,告诉对方数据已经接收,

    在这里插入图片描述

4.3.9额外丢包处理
  1. 发送方发送数据速度过快,接收方来不及取出,接收缓冲区满溢,之后的数据会丢失
  2. 发送方发送大量数据,网络不好导致大量数据丢失;
4.3.10滑动窗口机制

即依靠协议中的窗口大小实现流量控制

接收方通过协议中的窗口大小,告诉发送方最多可以发送多少数据
MSS:最大数据段大小,表示tcp数据通信时一条数据的最大大小,通信时双方进行协商,取双方mss中较小的一方作为最大数据段的大小;
滑动窗口通过前沿序号和后沿序号组成,窗口的大小不能大于缓冲区剩余空间的大小;
1.发送窗口:
后沿:所要发送数据的起始序号,后沿的移动取决于是否得到了数据回复
前沿:根据接收方的窗口大小计算的结束序号,取决于窗口的大小(前沿减去后沿的大小等于接收窗口的大小)
2.接收窗口
后沿:接收数据的起始序号,后沿的移动取决于是否接收到了新数据
前沿:根据缓冲区的剩余空间大小计算得到接收数据的结束序号,前沿的移动取决于剩余缓冲区的大小;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值