day27 网络通信协议 tcp/udp区别

时间:2022-05-14 14:54:10

今日主要内容:

一.网络通信协议

二.tcp udp协议下的socket

一.网络通信协议

1.1互联网的本质就是一系列的网络协议

本机IP地址('127.0.0.1',xxxx)

互联网连接的电脑互相通信的是电信号,

互联网协议的功能: 定义计算机如何接入Internet ,以及接入Internet的计算机通信的标准.

1.2 osi七层协议

互联网协议按照功能不同分为osi七层或tcp/udp五层或tcp/ip四层day27 网络通信协议 tcp/udp区别

socket 在五层通讯的应用层和传输层之间(又叫socket抽象层)

socket又称为套接字,他是应用层与tcp/udp协议族通信的中间软件抽象层,他是一组接口.

套接字socket的发展史及分类

  基于文件类型的套接字家族  套接字家族的名字: AF_UNIX

  Unix一切结尾文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一及其,可以通过访问同一个文件系统间接完成通信.

  基于网络类型的套接字家族  套接字家族的名字 :AF_INET

  (还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我们只使用AF_INET)

TCP/UDP的区别(重点)

1.TCP与UDP的对比

  TCP  可靠的 面向连接的协议,传输效率低全双工通信(发送缓存&接收缓存),面向字节流.

  使用TCP的应用: Web浏览器 ; 文件传输程序.

  UDP  不可靠的 无连接的服务,传输效率高,一对一 一对多 多对一 多对多 面向报文(数据包),尽最大努力服务,无拥塞控制.

  使用UDP的应用: 域名系统(DNS),视频流,IP语音包.

由下图直接比较其中的差异

day27 网络通信协议 tcp/udp区别

TCP和UDP下socket差异对比图:

day27 网络通信协议 tcp/udp区别

上图只是让大家感受一下TCP和UDP协议,socket工作流程的不同,两者之间的差异是 TCP需要连接,

而UDP不需要连接.

二.tcp协议下的socket

day27 网络通信协议 tcp/udp区别

上图就是通讯流程的大致描述

socket绑定IP和端口时可能初选下面的问题:

day27 网络通信协议 tcp/udp区别

解决办法:

#加入一条socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #在bind前加,允许地址重用
sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字
sk.listen() #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024) #接收客户端信息
print(ret) #打印客户端信息
conn.send(b'hi') #向客户端发送信息
conn.close() #关闭客户端套接字
sk.close() #关闭服务器套接字(可选)

但是如果你加上了上面的代码之后出现了下面这个问题:  OSError: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。如果出现了这个问题,只能换端口了,因为你的电脑不支持端口重用.

注 : 用socket进行通信,必须是一收一发对应.

2. TCP三次握手四次挥手(重点中的重点)

三次握手流程:

第一次握手(SYN=1, seq=x):

  客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。

  发送完毕后,客户端进入 SYN_SEND 状态。

第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):

  服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。

第三次握手(ACK=1,ACKnum=y+1)

  客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1

发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

四次挥手流程:

第一次挥手(FIN=1,seq=x)

    假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。

    发送完毕后,客户端进入 FIN_WAIT_1 状态。

第二次挥手(ACK=1,ACKnum=x+1)

  服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。

  发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。

第三次挥手(FIN=1,seq=y)

  服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。

  发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

第四次挥手(ACK=1,ACKnum=y+1)

  客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。

  服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

  客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

day27 网络通信协议 tcp/udp区别

UDP协议下的socket

day27 网络通信协议 tcp/udp区别

TCP 与 UDP 的区别 : 一个需要连接,一个不需要连接,但是TCP连接传输的速度相比较UDP慢,但是安全性比UDP高.