Python学习32天(socket、tcp协议)
守望了31天,终于等到了网络编程阶段,很多很多的基础原理知识,然后脑子懵了,进入新世界的感觉。
一、客户端\服务器架构
1.硬件C/S架构(打印机) 2.软件C/S架构
2.互联网中处处是C/S架构
如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种)
腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频) C/S架构与socket的关系:
学习socket就是为了完成C/S架构的开发
二、互联网协议
1.如何基于socket编程,来开发一款自己的C/S架构软件
2.C/S架构的软件(软件属于应用层)是基于网络进行通信的
3.网络的核心即一堆协议,协议即标准,你想开发一款基于网络通信的软件,就必须遵循这些标准。
4.让我们从这些标准开始研究,开启我们的socket编程之旅
然后是我们伟大的socket做了什么呢?请看下图
二、socket到底是一个什么东西呢?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的
三、关于嵌套字
套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。
套接字家族的名字:AF_UNIX
unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信
套接字家族的名字:AF_INET
(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)
一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理。
大致就是这么一个过程
四、socket实现一个简单的传输
客户端:
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.1.11',8000)) #拨通电话 phone.send('hello'.encode('utf-8')) #发消息 data=phone.recv(1024) print('收到服务端的发来的消息:',data)
服务端:
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机 phone.bind(('127.0.1.11',8000)) #绑定手机卡 phone.listen(5) #开机 print('---->') conn,addr=phone.accept() #等电话 msg=conn.recv(1024) #收消息 print('客户端发来的消息是: ',msg) conn.send(msg.upper())#发消息 conn.close() phone.close()
五、tcp协议的三次握手、四次挥手
1.三次握手:
首先由客户端(client)向服务器发送SYN请求,同时传输链接seq,服务器(server)不管是好是坏都会返回一个链接seq+1,随后客户端确认链接返回ACK = y+1
整个过程会相互回应,经过三次最终建立双向的传输链接
关于listen()就是用来存放SYN发起的半链接,只要三步没有全走完,就都是半链接,listen里面的参数就是表示存放的半链接数
同时也因为tcp协议不区分好坏的回复,就容易收到SYN洪水攻击(感觉很牛逼,其实我啥都不知道)
2.数据传输:
这个么得说的,你来我往的传输
3.四次挥手
断开链接时,往往是谁先结束传输,谁就发起断开,发起后,只要对方确认即可断开,但是传输时双向的,所以需要四次
如服务器往往为了保证自己的正常运行,在完成数据传输后就会主动断开链接,客户端确认后,服务器向客户端的就会断开了,此时客户端未发送断开请求,但是服务器已主动进入TIME_WAIT状态,反之也是一样的。
今天其实好多是没有听明白的,虽然自己闹了一下服务器和客户端的交互,但是好low啊
两个任务吧,
1.有空还是看一下linux基础部分的计算机基础 2.搞一个服务器虚拟机玩玩
今天就是这些了,需要抓紧消化一下了,明天自己试一试在服务器里处理客户端传递来的参数,哎呀呀,感觉小程序的路正在一步步靠近。
~~~~~