10 传输模型与套接字(进阶)

01-传输模型

第一部分 传输模型

1、基本模型

2、层次划分

MAC地址:唯一的地址

TCP可靠、UDP不可靠

3、传输层说明

说明一:

? 作为Python开发,咱们都是在应用层的HTTP协议之上进行开发的。

说明二:

网络编程,主要是了解我们Python能编写的最低的层次,即传输层的基本情况

说明三:

HTTP协议是基于TCP之上的,因此我们需要了解TCP连接的基本过程

第二部分 TCP连接

1、建立连接(三次握手)

为什么三次

因为第一次只是客户端告诉服务端

第二次,客户端才知道服务端收到了

第三次,服务端才知道客户端收到了

2、传输数据

客户端向服务端请求

服务端向客户端响应

一发一收

一收一发

3、断开连接(四次握手)

为什么多了一次?

因为服务端可能还数据要发。

到底是一次连接传一次数据;还是一次连接传多次数据?

都可以:HTTP协议 前者、Websocket 后者

第三部分 IP地址与端口

1、IP地址

127.0.0.1 自己

0.0.0.0 任意访问

2、端口号

端口是用来区分我们的应用程序的,范围:0-65535

02-套接字

第一部分 创建套接字

1、套接字的基本概念

2、创建套接字实例
>>> import socket
>>> sock = socket.socket()
>>> sock
<socket.socket fd=792,  # 文件描述符(唯一标识了一个socket)
family=AddressFamily.AF_INET,   # AF_INET表示IPv4
type=SocketKind.SOCK_STREAM,    # SOCK_STREAM表示TCP
proto=0>    # 通常都是0
3、三种套接字

第二部分 建立套接字连接

1、服务端监听套接字的绑定与监听
>>> import socket
>>> server = socket.socket()    # 生成套接字
>>> server.bind((‘0.0.0.0‘,8899))       # 绑定套接字,4个0为全网地址,可以不写
>>> server.listen(5)            # 监听套接字,5为监听数量
2、客户端套接字的主动连接
>>> import socket
>>> client = socket.socket()
>>> client.connect((‘127.0.0.1‘,8899))
3、服务端对等连接套接字的生成
>>> import socket
>>> server = socket.socket()
>>> server.bind((‘‘,8899))
>>> server.listen(5)
>>> conn,addr = server.accept()     # accept会阻塞
4、accept阻塞说明

第三部分 使用套接字传输

客户端 一发 一收

服务端 一收 一发

recv 会阻塞哟!

# 服务端
>>> import socket
>>> server = socket.socket()
>>> server.bind((‘‘,8899))
>>> server.listen(5)
>>> conn,addr = server.accept()
>>> conn.recv(1024)
b‘hello‘
>>> conn.send(b‘thanks‘)
6
?
# 客户端
>>> import socket
>>> client = socket.socket()
>>> client.connect((‘127.0.0.1‘,8899))
>>> client.send(b‘hello‘)
5
>>> client.recv(1024)
b‘thanks‘

第四部分 断开套接字连接

1、客户端主动断开连接
>>> import socket
>>> client = socket.socket()
>>> client.connect((‘127.0.0.1‘,8899))
>>> client.send(b‘hello‘)
5
>>> client.recv(1024)
b‘thanks‘
>>> client.close()  # 断开连接
2、服务端判断客户端断开连接
>>> import socket
>>> server = socket.socket()
>>> server.bind((‘‘,8899))
>>> server.listen(5)
>>> conn,addr = server.accept()
>>> conn.recv(1024)
b‘hello‘
>>> conn.send(b‘thanks‘)
6
>>> conn.recv(1024)
b‘‘         # 接收到空字节,表示客户端已经断开连接
>>> conn.close()    # 断开连接

总结:九个操作

操作一: 服务器套接字:bind

操作二: 服务器套接字:listen

操作三: 客户端套接字:connect

操作四: 客户端套接字:send

操作五: 对等连接套接字:recv

操作六: 对等连接套接字:send

操作七: 客户端套接字:recv

操作八: 客户端套接字:close

操作九: 对等连接套接字:close

原文地址:https://www.cnblogs.com/zcmq/p/9275858.html

时间: 2024-08-23 11:57:48

10 传输模型与套接字(进阶)的相关文章

TCP下的套接字编程

1.什么是套接字 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口.区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址.使用的传输层协议(TCP或UDP)和使用的端口号.Socket原意是"插座".通过将这3个参数结合起来,

1.2.1 流式套接字编程

1.2  获取网络中计算机的IP地址和计算机名 在开发网络应用的过程中,经常需要获取网络中某台计算机的IP地址和计算机名称.在本节的内容中,将介绍如何使用Visual C++ 6.0开发一个实现上述功能的应用程序. 1.2.1  流式套接字编程(1) 网络数据的传输是通过套接字实现的.套接字有3种类型:流式套接字(SOCK_ STREAM),数据报套接字(SOCK_DGRAM)及原始套接字(RAW).在本小节的内容中,将首先讲解流式套接字编程的基本知识. 流式套接字是面向连接的,提供双向.有序.

socket套接字编程 HTTP协议

socket套接字编程  套接字介绍  1. 套接字 : 实现网络编程进行数据传输的一种技术手段  2. Python实现套接字编程:import  socket  3. 套接字分类 >流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案.(面向连接--tcp协议--可靠的--流式套接字)  >数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案.(无连接--udp协议--不可靠--数据报套接字) tcp套接字编程  服务端流程  

原始套接字(SOCK_RAW)

本文转载:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html,在此感谢 原始套接字(SOCK_RAW). 应用原始套接字,我们可以编写出由TCP和UDP套接字不能够实现的功能. 注意原始套接字只能够由有 root权限的人创建. 10.1 原始套接字的创建 int sockfd(AF_INET,SOCK_RAW,protocol) 可以创建一个原始套接字.根据协议的类型不同我们可以创建不同类型的原始套接字 比如:IPPRO

什么是套接字?

简介 套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程. 非常非常简单的举例说明下:Socket=Ip address+ TCP/UDP + port. 主要参数 区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址.使用的传输层协议(TCP或UDP)和使用的端口号.Socket原意是 “插座”.通过将这3个参数结合起来,与一个“插座”Socket绑定,应

Linux Socket 原始套接字编程

对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发之自己构建协议头.对于原始套接字编程有些细节性的东西还是需要注意的. 1. 原始套接字创建 原始套接字的编程和udp网络编程的流程有点类似,但是原始套接字编程中不需要bind操作,因为在数据接收和发送过程中使用sendto和recvfrom函数实现数据的接收和发送.不过不是说原始套接字不能使用bin

Socket(套接字) IP TCP UDP HTTP

Socket(套接字) (转)什么是套接字(Socket)? 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)(socket是操作系统提供出来的接口)的接口,区分不同应用程序进程间的网络通信和连接.生成套接字,主要有3个参数:通信的目的IP地址.使用的传输 层

《网络编程》基本 UDP 套接字编程

在前面文章中介绍了<UDP 协议>和<套接字数据传输>.UDP 协议和 TCP 协议不同,它是一种面向无连接.不可靠的传输层协议.在基于 UDP 套接字编程中,数据传输可用函数 sendto 和 recvfrom.以下是基本 UDP 套接字编程过程: sendto 与 recvfrom 函数 这两个函数的功能类似于 write 和 read 函数,可用无连接的套接字编程.其定义如下: /* 函数功能:发送数据: * 返回值:若成功则返回已发送的字节数,若出错则返回-1: * 函数原

什么是套接字(Socket)

应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接. 生成套接字,主要有3个参数:通信的目的IP地址.使用的传输 层协议(TCP或UDP)和使用的端口号.Socket原意是“插座”.通过将这3个参数结合起来,与一个“