网络编程之网络基础部分

时间:2021-08-21 19:50:35

 

客户端/服务器架构

1.硬件C/S架构(打印机)

2.软件C/S架构(web服务)

3.B/S架构:以Browser作为客户端

4.B/S架构是C/S架构的一种

服务端:24小时不间断提供服务

客户端:什么时候想体验服务,就去找心仪的服务端寻求服务

 

手机端看上去cs架构比较火,实际上bs已经在崛起

微信支付宝都在做一件事:统一接口

手机端之后肯定也是bs比较火

 

ip+mac定位到主机,port定位到指定的应用程序

port(0~65535) 1024是系统用的 之后自己随便用

ip+port定位到某一台电脑的某个软件

pid是同一台机器上不同进程或现代的标识,而一个程序有很多进程

osi七层/五层

OSI五层协议:应传网数物 应用层 传输层 网络层 数据链路层 物理连接层

网络编程之网络基础部分

 

OSI七层协议:应表会传网数物 应用层 表示层 会话层 传输层 网络层 数据链路层 物理连接层

 

网络编程之网络基础部分

网络编程之网络基础部分

1.物理层:

网线 无线电波 本质:传输低电平 高电平 用来代表0和1

2.数据链路层(以太网协议):

    2.1 对电信号初始分组(8位一组)

一组电信号构成一个数据包,叫帧 每一数据帧:报头head(固定18字节)+数据data(46字节~1500字节)=64字节~1518字节,超过就分片发送 head+data=数据包

head:

  • 发送者/源mac地址=6字节

  • 接受者/目标mac地址=6字节

  • 数据类型=6字节

数据链路层的通信方式为广播 接收到广播的主机如果发现目的mac地址不是自己,就丢掉

    2.2 以太网协议(mac地址):

规定了任何一台接入互联网的计算机都必须有一块网卡 每一块网卡上面都刻有世界上独一无二的编号,即mac地址: 12位16进制的数,前6位是厂商编号,后6位是流水线编号

互联网是有N多个局域网彼此之间连接而成的

网络编程之网络基础部分

    • 一组电信号构成一个数据包,叫帧
      每一数据帧:报头head(固定18字节)+数据data(46字节~1500字节)=64字节~1518字节,超过就分片发送
      head+data=数据包
      head:

      • 发送者/源mac地址=6字节
      • 接受者/目标mac地址=6字节
      • 数据类型=6字节

        接收到广播的主机如果发现目的mac地址不是自己,就丢掉

3.网络层

广播效率低,且有网络风暴

ip协议 主机跨网段就发给网关

head(以太网头+ip头)+数据包(head+data)

ARP协议(获取对方mac):未知对方mac情况下 通过广播,发送(源mac+目标mac全F+源ip+目标ip+数据部分 ) 全F表示想获取目标ip的mac地址

主机包中 有网关 即可找到目的主机的网关,主机包中有ip,即可获得目的主机的mac

4.传输层

端口到端口的通信 找到主机的具体一个程序(0~65535)

 TCP/UDP都是基于端口工作的协议
端口(port)  

计算机与计算机之间其实是计算机上的应用程序与应用程序之间的通信

端口:用来唯一标识一台计算机上的某个应用程序
端口号的范围:0~65535
注意:0~1024这些都是操作系统默认使用的端口号
建议:使用8000之后的端口
MySQL默认端口:3306
Redis默认端口:6379
django默认端口:8000
flask默认端口:5000

端口号是动态分配的
第一次起qq分配到的是8989
将qq关闭再次启动端口号可能就变了
TCP协议
流式协议,可靠协议
基于TCP协议通信 必选先建立双向通道

问题:TCP协议传输数据之所以可靠的原因就在于有双向通道???
答:链接是双向的 且有应答机制

底层实现: tcp协议在传输层

查看linux端口状态: netstat -an |grep 8080

 

TCP协议---建立连接三次握手 :

1.客户端请求建立客户端-服务端的连接

2.服务端同意建立,客户端状态变为ESTABLISHE,并请求建立服务端-客户端的连接

3.客户端同意建立连接,客户端状态变为ESTABLISHE

网络编程之网络基础部分

SYN洪水攻击

无数个客户端一直发SYN请求,服务端好人肯定会回应,并等着客户端的请求消息,而客户端只发了SYN,那么服务端进入"半链接池"backlog,即 listen(n)为最大挂起数量,正常的访问就进不来了 解决办法:减少尝试等待客户端回应次数,listen值调大

tcp数据传输: 客户端发消息-服务端读-服务端发确认收到消息,服务端发消息-客户端读-客户端发确认收到消息

TCP协议---断开连接四次挥手:

谁先发完包并conn.close() ,就是谁主动发起断开请求 比如客户端包发完了,准备断开客户端到服务端的连接 这时客户端进入FIN_WAIT_1状态,服务端发送ACK给客户端,客户端收到后马上断开客户端到服务端的连接,并进入FIN_WAIT_2状态,接着服务端又发一条FIN,客户端收到进入TIME_WAIT状态,客户端回ACK,服务端收到后,断开服务器-客户端连接

谁先断开连接?都有可能,谁数据发完了,就是谁发起的断开请求,还没发完的那个,肯定不会发起断开请求,可以观察,只要谁有FIN_WAIT,TIME_WAIT状态,谁就是发起断开连接的一方

而生产状态的大并发的服务器,只要服务器发完包,就发起断开连接,节省资源

为何需要3次握手,4次挥手

  • 3次握手中服务端同意建立,和请求建立可以放一起发,这时候没有数据传输,只是单纯想互相建立连接

  • 4次挥手中,客户端说发完了要断开连接,服务端可能还有部分数据没发完呢,不能把同意断开连接和请求断开连接一起发,否则丢包

 

5.应用层

1.应用层:程序 2.表示层:加密解密,压缩解压缩 3.会话层:建立会话

应用层 协议举例:HTTP协议 FTP协议