计算机网络自顶向下结构——第7版

第二章实验,套接字编程

代码运行环境:window10,python 3.8.对于书上代码略作修改。

进程与计算机网络之间的接口

多数应用程序是由通信进程队组成的,每对中的两个进程互相发送报文。而从一个进程向另外一个进程发送的报文必须经过下面的网络。进程通过一个称为套接字的软件接口向网络发送报文和从网络接收报文。

简单理解一下:如果把一个进程比作一座房子,那么套接字就可以类比为他的门。当一个进程想要向位于另一台主机上的另一个进程发送报文的时候,他要向把报文推送出门,该发送进程假定该门到门外一侧之间有运输的基础设施,该设施会把报文传送到目的进程的门口。一旦报文抵达目的主机,它就会通过接收进程的门传递,然后接收进程对该报文进行处理。

如上图所示,套接字是同一台主机内层应用程序和网络之间的接口。由于其建立网络应用程序的可编程接口,所以也叫做应用程序和网络之间的应用编程接口(API application programming interface)

应用层虽然可以空hi套接字在顶层应用端的一切,但是对于套接字的运输层几乎没有控制权。嗯,仅限于:选择运输层协议,或者说可以设定几个参数,简单类似于最大缓存最大报文端长度等。

UDP交互过程

结用上面的理解,

  1. 在发送进程能够将数据分组退出套接字门之前,当使用UDP时,必须先将目的地址附在该分组之上。
  2. 在该分组传过发送方的套接字之后,因特网使用该目的的地址通过因特网为该分组选路到接收进程的套接字。
  3. 当分组到达接收套接字时,接收进程将通过该套接字取回分组,然后检查分组内容并采取适当措施。

附在分组的目的地址包括:

  1. 目的主机的IP地址,用于路由选路找到网络中正确的目的主机
  2. 包含目的进程的端口号,用于区分目的主机中是哪一个进程使用的哪一个套接字。

同样,发送方的IP地址和端口地址也要附在分组中,便于回信——这个操作是由底层操作系统自动完成。

应用程序功能

使用简单的客户-服务器应用程序来演示对于UDP和TCP的套接字编程:

  1. 首先,客户应用程序从其键盘读取一行字符数据并将数据向服务器发哦是那个
  2. 然后,服务器接收该数据并将这些字符转换为大写
  3. 服务器将修改的数据发送给客户
  4. 客户接收修改的数据并显示

UDP套接字流程:

UDP套接字编程

UDPCLient.py

from socket import *
serverName = 'hostname' #这里的hostname使用自己主机的IPv4地址,也可以使用自己电脑的名字
serverPort = 12000
clientSocket = socket(AF_INET,SOCK_DGRAM)#参数的意思可以看我给的两个博客
message = input('Input lowercases sentence:')
clientSocket.sendto(message.encode(),(serverName,serverPort))
modifiedMessage,serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage.decode())
clientSocket.close()

AF_INET域与AF_UNIX域socket通信原理对比

流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM) 的比较

from socket import *
serverPort = 12000
serverScoket = socket(AF_INET,SOCK_DGRAM)
serverScoket.bind(('',serverPort))
print("The server is ready to receive")
while True:message, clientAddress =serverScoket.recvfrom(2048)modifiedMessage = message.decode().upper()serverScoket.sendto(modifiedMessage.encode(), clientAddress)

运行结果:

关闭server:

TCP套接字编程

TCP是一个面向连接的协议。

意味着客户与服务器开始交换数据之前必须建立一个TCP连接。

创建TCP连接时,我们将客户套接字地址于服务器套接字地址关联起来。使用连接时,当一次要向另外一侧发送数据时,他只需要经过其套接字将数据丢进TCP连接。这就与UDP不同,UDP服务器将数据丢进套接字前必须附加一个目的地址。

TCP交互

客服具有向服务器发起接触的任务。服务器为了能够对客户的初始接触做出反应,服务器必须提前准备好。这意味着:

  1. 与使用UDP类似,TCP服务器在客户试图发起接触前必须作为进程运行起来。
  2. 服务器必须有一扇特殊的门(套接字),这门欢迎来自运行在任意主机上的客户进程的初始接触(knock the door)

在服务器运行的时候,客户创建一个TCP套接字即可以向服务器发起一个TCP连接。客户生成套接字时,指定了服务器套接字的地址,即服务主机IP和其套接字端口。然后发起三次握手并创建一份与服务器的TCP连接。

发送在运输层的三次握手,对于客户和服务器程序来说是完全透明的。

服务器在第一次收到客户的接触(knock the door)时,他会新生成一个套接字,用于特定的用户。新生成的套接字也叫做连接套接字。

通信过程

TCPClient.py

from socket import *
serverName = 'servername'
serverPort = 12000
clientSocket = socket(AF_INET,SOCK_STREAM)
clientScoket.connect((serverName,serverPort))
sentence = raw_input('Input lowercase sentence:')
clientSocket.send(sentence.encode())
modiefiedSentence = clientSocket.recv(1024)
print('From Server: ',modifiedSentence.decode())
clientSocket.close()
#TCPServer.py
from socket import *
serverPort = 12000
serverSocket=socket(AF_INET,SOCK_STREAM)
serverSocket.bind(('',serverPort))
serverSocket.listen(1)
print('The server is ready to receive')
while True:connectionSocket,addr = serverSocket.accept()sentence = connectionSocket.recv(1024).decode()capitalizedSentence = sentence.upper()connectionSocket.send(capitalizedSentence.encode())connectionSocket.close()

运行结果

关闭server:

计网实验原理-TCP/UDP套接字编程相关推荐

  1. 网络编程---TCP/UDP套接字编程原理

    本篇介绍的是Linux下的网络编程,故有些接口是不适用于Windows的,但是具体概念和实现方法是大体一致的 本篇重在讲解原理,具体实现请戳这里->UDP套接字编程实现 介绍 网络编程套接字(s ...

  2. TCP和UDP套接字编程

    一.Socket简单介绍 如果要在应用层调用传输层的服务,进行相关程序的设计,就要涉及到套接字编程.套接字也称之为Socket,本质上它就是利用传输层提供的一系列Api来进行网络应用程序的设计. 网络 ...

  3. 【网络编程】Socket套接字;UDP数据报套接字编程;TCP流套接字编程

    文章目录 1. 什么是网络编程 2. 网络编程中的基本概念 3. Socket套接字 4 UDP数据报套接字编程 4.1 客户端服务器交互流程 4.2 UDP版本的回显服务 4.3 英译汉服务 5. ...

  4. 【Linux网络编程】UDP 套接字编程

    [Linux网络编程]UDP 套接字编程 [1]用户数据报协议(UDP) UDP是一个简单的传输层协议,不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数 ...

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

    在前面文章中介绍了<UDP 协议>和<套接字数据传输>.UDP 协议和 TCP 协议不同,它是一种面向无连接.不可靠的传输层协议.在基于 UDP 套接字编程中,数据传输可用函数 ...

  6. Linux IPv6 UDP套接字编程示例

    udp ipv6套接字编程和ipv4接口类似,参数略有不同,流程都包括创建套接字.绑定地址.发送等. 下面是一个udp ipv6 demo, 包括创建ipv6套接字.绑定地址和发送数据等. 首先先在l ...

  7. linux udp套接字编程获取报文源地址和源端口(二)

    之前项目中涉及udp套接字编程,其中一个要求是获取客户端发过来报文的端口和ip地址,功能很简单,只是对这一块不很熟.之前使用的方法是通过调用recvmsg这个接口,并通过参数msg里面的msg_nam ...

  8. UDP套接字编程——Python语言描述

    首先,回顾一下.在我们使用Socket编程之前的一些网络的概念. IP:它是用来标识处于Internet之中的端系统的. MAC:它是用于在同一局域网中标识不同的计算机的. 端口号:它是用来标识同一台 ...

  9. JAVA UDP套接字编程

    JAVA UDP套接字编程 UDP套接字 无连接 非可靠传输 面向数据报 package com.lius.udp;import java.io.IOException; import java.ne ...

最新文章

  1. AlertDialog的使用(二):分别创建
  2. Zabbix的故障与恢复邮件设置
  3. 前端实现数字快速递增_艾默生新型超声波发生器的数字控制功能可实现快速设置和准确操作...
  4. .NET MYSQL数据库操作基类( C#源码)
  5. VC++6.0开发环境之快捷键
  6. String(byte[] bytes, int offset, int length)
  7. 常用的python测试脚本_详解Python的单元测试
  8. ViewDragHelper
  9. 数据仓库模型与缓慢变化维度技术深度剖析-DW商业环境实战
  10. DP--POJ1191 棋盘分割
  11. wps或者word点击打印预览时出现空白页,不显示内容
  12. 听课笔记-名校启程大学规划课
  13. WP7 SDK模拟器对应PC键盘的功能键
  14. 全国计算机一级选择题免费,全国计算机一级考试选择题试题与详细答案
  15. TCP通信多发多收,和接收多个客户端消息
  16. (转载)纳豆的家庭制作、保存和食用
  17. 后端@RequestBody postman 如何设置
  18. 日常中一些好用的小软件
  19. ae渲染存在偏移_(图文+视频)C4D+AE野教程:一起来制作一个MG方块动画吧
  20. go基础之map-增和改(二)

热门文章

  1. 干饭了干饭了 适合新手 git命令和流程
  2. css opacity影响子元素解决办法
  3. 飞机大战------功能更新
  4. springboot+vue 课程在线考试系统 java
  5. 疯狂!丈母娘让我用 Python 算领证吉日!
  6. [POI2007]洪水pow 并查集
  7. 什么是物联网,什么是区块链
  8. GO语言的package怎么使用
  9. 批量将MP4 转换为 MP3
  10. 网秦面临摘牌:股价长期低于1美元 创始人陷入内斗