码迷,mamicode.com
首页 > 其他好文 > 详细

网络编程

时间:2018-01-25 19:53:09      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:line   tcp   基本   决定   一个   连接   解决   icmp   实现   

网络中进程之间如何通信?

  首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。

技术分享图片

 

====================人工互联网协议分层========================
应用层: 它只负责产生相应格式的数据 ssh ftp nfs cifs dns http smtp pop3
-----------------------------------
传输层: 定义数据传输的两种模式:
TCP(传输控制协议:面向连接,可靠的,效率相对不高)
UDP(用户数据报协议:非面向连接,不可靠的,但效率高)
-----------------------------------
网络层: 连接不同的网络如以太网、令牌环网
IP (路由,分片) 、ICMP、 IGMP
ARP ( 地址解析协议,作用是将IP解析成MAC )
-----------------------------------
数据链路层: 以太网传输   mac地址
-----------------------------------
物理层: 主要任务是规定各种传输介质和接口与传输信号相关的一些特性 比如网卡等硬件连接

1.TCP和UDP
    当您编写socket应用程序的时候,您可以在使用TCP还是使用UDP之间做出选择。它们都有各自的优点和缺点。
    TCP是流协议,而UDP是数据报协议。换句话说,TCP在客户机和服务器之间建立持续的开放连接,在该连接的生命期内,字节可以通过该连接写出(并且保证顺序正确)。然而,通过 TCP 写出的字节没有内置的结构,所以需要高层协议在被传输的字节流内部分隔数据记录和字段。
    另一方面,UDP不需要在客户机和服务器之间建立连接,它只是在地址之间传输报文。UDP的一个很好特性在于它的包是自分隔的(self-delimiting),也就是一个数据报都准确地指出它的开始和结束位置。然而,UDP的一个可能的缺点在于,它不保证包将会按顺序到达,甚至根本就不保证。当然,建立在UDP之上的高层协议可能会提供握手和确认功能。
    对于理解TCP和UDP之间的区别来说,一个有用的类比就是电话呼叫和邮寄信件之间的区别。在呼叫者用铃声通知接收者,并且接收者拿起听筒之前,电话呼叫不是活动的。只要没有一方挂断,该电话信道就保持活动,但是在通话期间,他们可以自由地想说多少就说多少。来自任何一方的谈话都按临时的顺序发生。另一方面,当你发一封信的时候,邮局在投递时既不对接收方是否存在作任何保证,也不对信件投递将花多长时间做出有力保证。接收方可能按与信件的发送顺序不同的顺序接收不同的信件,并且发送方也可能在他们发送信件是交替地接收邮件。与(理想的)邮政服务不同,无法送达的信件总是被送到死信办公室处理,而不再返回给发送。

2.IP和Port
    除了TCP和UDP协议以外,通信一方(客户机或者服务器)还需要知道的关于与之通信的对方机器的两件事情:IP地址或者端口。IP地址是一个32位的数据值,为了人们好记,一般用圆点分开的4组数字的形式来表示,比如:64.41.64.172。端口是一个16位的数据值,通常被简单地表示为一个小于65536的数字。一个IP地址获取送到某台机器的一个数据包,而一个端口让机器决定将该数据包交给哪个进程/服务(如果有的话)。

 

 

Socket是什么

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭).
说白了Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。简单来说socket就是一个模块,ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。 所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。

socket()函数

Python 中,我们用 socket()函数来创建套接字,语法格式如下:

 
                      socket.socket([family[, type[, proto]]])

参数

  • family: 套接字家族可以使AF_UNIX或者AF_INET
  • type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAMSOCK_DGRAM
  • protocol: 一般不填默认为0

TCP编程(tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。
 
TCP连接简图: 三次握手,数据传输,四次挥手
三次握手
 
技术分享图片

数据传输

在此期间形成一个双向的通道进行数据交互

四次挥手

技术分享图片

简单实例:

服务端
# import socket # sk
=socket.socket(AF_INET,SOCK_STREAM) # sk.bind((127.0.0.1,8081)) #绑定ip和端口 # sk.listen() # conn,addr=sk.accept() # # print(addr) # while True: # ret=conn.recv(1024).decode(utf-8) # if ret==886: # break # ret=(bytes(ret,encoding=utf-8)) # print(ret) # content=input(<<<) # conn.send(bytes(content,encoding=utf-8)) # conn.close() # sk.close()

客户端
# import socket
# sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# sk.connect((‘127.0.0.1‘,8080))
# while True:
# content=input(‘<<‘)
# if content==‘886‘:
# break
# sk.send(bytes(content,encoding=‘utf-8‘))
# ret=sk.recv(1024).decode(‘utf-8‘)
# print(ret)
# sk.close()
 
 
udp

网络编程

标签:line   tcp   基本   决定   一个   连接   解决   icmp   实现   

原文地址:https://www.cnblogs.com/liusouthern/p/8352832.html

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