网络编程的理论概念
网络编程的理论概念
什么是网络
网络:物理链接介质+各种通讯协议
c/s架构(client/sever)
我们生活中处处都是c/s架构,b/s架构(Browser/Server)也是c/s架构的一种,这种架构简单的说就是服务器端与客户端的交互
而socket就是为了完成c/s架构的开发我们所使用的一种方式。
osi七层
osi七层分为哪几层呢:
应用层:(应用层,表示层,会话层合并为一层)http、ftp、自定义协议
传输层:tcp或udp协议(端口port)
网络层:ip协议(ip地址)
数据链路层:ethernet或以太网协议(mac地址)
物理层:
在我们学习socket编程之前,我们可以先对这个osi七层有一些了解,这个osi七层本质就是一堆协议,我们使用互联网与他人进行通讯,这时候我们就依赖这些协议。
简单的说这个osi协议就是帮助我们将需要发送的数据包装起来,最后化成一堆二进制格式的信号传给另外一台主机,最后这台主机上的应用通过解析这个数据包获得需要的数据。
若是需要详细的了解这个osi协议的运行过程可以参考这位大佬的博客:http://www.cnblogs.com/linhaifeng/articles/5937962.html
为什么要了解osi七层:
1.首先,我们现在学习的是有关网络编程的有关问题,而只要与网络搭上关系,不论你是否愿意,你必须与这些协议打交道。因此不论你是否愿意都应当适当的了解一些网络编程的相关内容,这也能帮助你在后续的学习中更好的掌握socket的使用方法
2.其次,你了解了这方面的内容,哪怕只是略懂皮毛,也能助你在与他人交谈的过程中多一份谈资,何乐不为呢。
socket层
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tFFXX1p1-1597708718844)(C:\Users\QAQ\Desktop\python学习\图片\网络编程\socket层.jpg)]
如上图,我们可以明白在我们的电脑中socket主要起到的作用是什么
它主要负责的就是提供接口帮助我们把用户软件中发送的信息发送给不同的协议,以用来帮助我们从记一些繁重的协议中解脱出来。
也正因此我们可以无需深入了解TCP/UDP的协议,可以直接进行开发操作
ps:我们平时说的套接字就是socket
Tcp三次握手,四次挥手
三次握手的过程
1.首先客户端向服务端发送一个请求,其中包含了seq***与syn(synchronous),并进入SYN_SENT状态
2.客户端收到该请求,进入SYN_RCVD状态,返回一个数据包,其中包含syn,ack(acknowledgement character),seq,ack代表自己已经收到消息并且同意,ack = seq(客户端传过来的)+1,并且返回一个seq(随机生成)
3.客户端接收到消息,进入ESTABLISHED状态,然后向客户端发送一个ack=seq+1代表收到,客户端再收到后也进入ESTABLISHED状态然后通道就建成了
ps:该通道主要用于应用数据的传输,TCP的各种请求不通过该通道
四次挥手
四次挥手的过程:
四次挥手与三次握手流程基本一致,只是进入的状态不同,以及发送数据包的发送次数不一样
1.客户端向服务端发送请求,数据包中包含FIN请求与seq,之后客户端进入FIN_WAIT_1状态
2.服务端收到数据包,进入CLOSE_WAIT状态,返回给客户端一个ack以及新建的seq
3.客户端收到数据包,进入FIN_WAIT_2状态,等待服务端的二次请求,服务端等到数据全部传输完后,再发送一个数据包,包含一个ack以及新建的seq,进入LAST_ACK状态
4.客户端收到数据包,返回一个ack消息,代表收到消息。服务端收到消息进入CLOSED状态
半连接池
TCP协议:客户端向服务端发送请求后,客户端会把这些请求放在半连接池中,也就是说半连接池是服务端专门用于存放这些链接请求的地方。当客户端同意了链接请求后,半连接池就会把该请求拿出。最后半连接池是有最大的存放限制的。这是可以由服务端自己设置的。即socket中的listen()