码迷,mamicode.com
首页 > 编程语言 > 详细

Python学习32天(socket、tcp协议)

时间:2020-03-26 01:32:35      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:图片   网站   标准   朋友   recv   虚拟   拨号   设计模式   数据   

  守望了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.搞一个服务器虚拟机玩玩

 

  今天就是这些了,需要抓紧消化一下了,明天自己试一试在服务器里处理客户端传递来的参数,哎呀呀,感觉小程序的路正在一步步靠近。

  ~~~~~

 

Python学习32天(socket、tcp协议)

标签:图片   网站   标准   朋友   recv   虚拟   拨号   设计模式   数据   

原文地址:https://www.cnblogs.com/xiaoyaotx/p/12571814.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!