本笔记是主要是根据学校《TCP/IP和网络软件编程》课的课件整理的,因为部分内容与计算机网络课重合,因此笔记只记录了计算机网络课上没讲的内容,主要作补充之用,更详细的内容可见《计算机网络》笔记。

第一章 TCP/IP协议概述

TCP/IP协议起源于ARPNET,ARPNET最初用于国防网络研究。随着连入ARPNET的电脑数量增加,就需要一种新的网络通信协议来管理,TCP/IP就出现了。
TCP/IP协议主要分为两部分:检测网络中传输差错的传输控制协议TCP,负责对不同网络进行互连的协议IP。

  • TCP/IP的体系结构
    TCP/IP协议采用了分层的思想,将网络系统按功能分为四层,称为协议栈,每一层都向它的上层提供服务,并使用下层所提供的功能。
    从下到上为网络接口层、网络层、传输层、应用层。
    网络接口层:协议栈的最底层,表示能够传输数据的物理网络。
    网络层:主要功能是将源主机上的IP数据报发到另一台主机,端到端的通信,主要协议是IP协议。两大块内容:IP地址和路由选择。IP层提供的是一种“尽力而为”的传输服务,并不是可靠传输。
    传输层:应用进程间的通信
    应用层:提供面向用户的网络服务,如HTTP/DNS等。

  • Internet整体架构
    Internet整体可看成是由三个级别的网络组成,国家主干网-地区级网络-企业或校园网,三层网络通过路由器连接起来。

  • TCP/IP中的封装和解封
    传输数据时,从首部开始,由上到下依次通过协议栈的每一层,直到数据被当作一串比特流送入物理网络,其中每一层对收到的数据都会增加一些首部信息,称为封装/打包
    接收数据时,从下到上通过协议栈的每一层,每一层会对数据首部进行提取和处理,称为解封/拆包

  • OSI七层模型
    OSI和TCP对比
    会话层:在传输层的基础上提供应用进程间的会话控制机制,包括建立和维持会话、同步会话等。
    表示层:不同的计算机体系结构所使用的数据表示法不同,表示层就为异构的计算机通信提供一种公共表示方法。
    应用层:面向用户,包含使用网络服务的各种应用程序。
    注:OSI强调严格的层次划分,因此灵活性较差;TCPIP更强调功能分布而非层次划分,因此其更为灵活,但也因此层次间的分界不是那么明晰。

网络与通信相关组织机构

ISO:国际标准化组织(International Organization for Standard),是目前最大的国际标准化组织。
ITU:国际电信联盟(International Telecommunication Union),研究电信领域的技术、业务和资费问题,并制定国际标准建议。
IEEE:电子电气工程师协会(Institute of Electrical and Electronics Engineers),是国际电子电信行业最大的专业学会,网络与通信中很多标准就是IEEE制订的,如IEEE 802.2:局域网中逻辑链路层的控制协议;IEEE 802.11系列:无线通信的系列协议标准。
ELA:美国电子工业协会(Electronic Industries Association),其制订的最著名的标准是目前在PC机和通信设备上广泛使用的RS-232接口。
RFC文档:请求评价文档(Request for Comments),针对一些协议和建议标准的征求意见稿。

第二章 网络接口层和网络层

物理层

  • 传输介质
    有线介质:同轴电缆、双绞线(使用RJ45接头)、光缆;无线介质:IEEE 802.11系列标准。

  • 同步传输与异步传输
    同步传输:
    通信过程中发送方和接收方在时间上保持步调一致,如:何时检测跳变信号、上升沿还是下降沿、检测频率是多少等。
    同步传输在发数据前先发送一串同步字符SYN,接收方只要检测到两个以上的SYN,就可以确认已进入同步状态,双方即在同一时钟频率下工作了。
    这种方式仅在数据开始传送前添加控制字符SYN,因此传送连续、大量数据的效率比异步传输高。
    异步传输:
    把各个字符分开传输,字符与字符间插入起止信息,通信双方无需同步频率(依靠检测起止位来接收数据),适合传送不连续的、突发的信息。
    异步传输数据格式

  • 信道复用
    频分复用(FDM):在同一时间占用不同的频带资源。
    时分复用(TDM):在不同时间占用相同的频带资源,类似时间片轮转。
    统计时分复用(STDM):与TDM的不同在于,其并非固定顺序分配时间,而是按需动态分配。
    波分复用(WDM):光的频分复用,用一根光纤同时传输多个光载波信号。
    码分多址(CDMA):根据不同编码方式来复用。

数据链路层

  • 基本概念
    物理层上的第一层,提供基本的流量控制和差错校验功能,将不可靠的物理链路变为可靠的数据链路(无比特差错)。

  • 局域网
    地理范围、互连设备有限的计算机网络,多由单一组织机构建。
    基本组成:
    服务器:为局域网提供服务,如资源共享服务。
    网路适配器/网卡:NIC(Network Interface Controller),提供通信连接,发送和接受数据。
    相关协议软件、驱动程序

网络层

  • 网络层的两种连接方式
    面向连接:在路由器上建立固定的线路,好像在通信的源和目标之间建立了一条逻辑通路,称为虚电路,接收端会收到顺序严格一致的数据分组。
    无连接:源端和目标端之间没有逻辑通路,但是送入网络的每一个分组都带有完整的目标主机地址,路由器会根据目标地址和当前网络状况选择合适的线路。
    IP协议实现了无连接的通信,TCP协议实现了面向连接的通信。为什么这样设计?IP无连接保证了网络层的简单和灵活、TCP面向连接保证了传输的质量。

  • 网络互连技术
    网络互连主要通过路由器来实现,将异构网络连接起来,构成一个整体同一的互联网。
    路由转发算法:见《计算机网络》笔记。
    路由器实现的功能:
    1、为网际通信选择合适的路由线路;
    2、根据需要对数据包进行拆分和组装;
    3、将使用不同协议的网络连接起来,构成统一的互联网;
    4、网络安全,目前大部分路由器具备一定的防火墙功能。

IP协议

IP互联网中的计算机没有主次之分,唯一标识主机的是IP地址,因此各主机地位平等。
IP互联网没有确定的拓扑结构。
每个接入互联网的设备都需要有IP地址,因此路由器、网关也会有IP地址,主机至少有一个IP地址(实质是一个网卡一个IP地址)。

  • IP数据报
    数据在内存中字节序:大端模式,高字节在低地址,低字节在高地址;小端模式:低字节在低地址,高字节在高地址。
    IP数据报传输的字节序:最高位在左记为第0位,最低位在右记为第31位。网络传输时,先传0-7位,再传24-31位。
    各标志字段具体作用见《计算机网络》笔记

  • IP数据报的分片和重组
    网络在进行数据传输时,对帧的最大长度会有限制,这个限制被称为最大传输单元MTU。
    不同网络的MTU值可能不同,如果主机通信要经过多个网络,通常取最小的MTU值,被称为路径MTU,以太网的MTU为1500(数据链路层帧加头加尾最长为1518)。
    若IP数据报的长度大于MTU,则IP层就需要对IP数据报分片,不同分片:标识字段相同,标志字段都是DF=0,MF=1后面还有分片,MF=0后面没有分片。

ICMP协议

Internet控制报文协议(Internet Control Message Protocol),介于网络层和传输层之间,作为IP协议的补充而存在。
主要有两类消息:Error,错误信息;Informational,消息/咨询性质。
ICMP报文封装在IP数据报中传输,但一般不认为其是高层协议,因为:ICMP仅传送差错与控制信息,且处理都需要IP层来执行,因此把它看作是IP层的补充协议。

  • ICMP报文的特点
    ICMP差错报文都是由路由器发送到源主机的(向源主机报告差错信息)。
    ICMP差错报文只负责报告,不负责对各类差错采取什么处理措施。
    ICMP差错报文是伴随着抛弃出错的IP数据报而产生的(如TTL减为0时,路由器将丢弃数据报,返回ICMP差错报文)。
    ICMP差错报文不享有任何优先权。

  • 其他
    TCPIP课中IP地址没讲CIDR,其他和计算机网络课内容相同,具体内容参见计算机网络笔记

第三章 运输层

  • 端口号的分配
    端口号:16位二进制数(0-65535),分为保留端口号和自由端口号。
    保留端口号:0-1023,系统保留,用户一般不适用
    其中0-255为一些众所周知的服务,如21-FTP,23-Telnet,80-HTTP等。
    256-1023通常由Unix服务占用,提供一些特殊的Unix服务。
    1024以上为自由端口号,由程序进行通信之前动态地向系统申请。

TCP各字段作用
建立连接为什么三报文握手?理论上三次是能够在不可靠信道上双方达成一致的最小值。

第四章 Socket编程

Socket为一种网络编程规范,具体指网络通信的逻辑端点,由IP地址+端口号组成,位于传输层与应用层之间。
通信时应用程序将数据写入Socket中,Socket通过网卡将信息发送到另一台主机的Socket,再传到相应的接收方应用程序,即完成了通信。

TCP通信过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#服务端

#第一步:初始化Socket
import socket
HOST = 'xxx.xxx.xxx.xxx'
PORT = xxx
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # SOCK_STREAM表明是TCP模式
#第二步:Socket与地址、端口号绑定
s.bind((HOST, PORT))
#第三步:监听请求消息
s.listen(1)
#第四步:接收请求消息
conn,address = s.accept()
#第五步:收发数据
#从缓冲器获得数据,参数为最大读取数量
raw = conn.recv(100)
#第六步、关闭连接
s.close()

#客户端
import socket
HOST = 'xxx.xxx.xxx.xxx'
PORT = xxx
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect((HOST,PORT))
# 发送数据, 必须是byte类型的的数据
# 使用encode函数,将字符串通过UTF8编码为字节类型
c.send('Hello World!'.encode())
c.close()

UDP通信过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 服务端
import socket
HOST = '127.0.0.1'
sPORT = 9976
cPORT = 9975
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # SOCK_DGRAM表明是UDP模式
s.bind((HOST,sPORT))
# 此函数一直阻塞当前线程, 直到收到数据
# 返回值:(b'Hello From UDP', ('127.0.0.1', 9975)),给出了收到的数据以及来源信息(IP地址和端口号)
s.recvfrom(100)

# 客户端
import socket
HOST = '127.0.0.1'
sPORT = 9976
cPORT = 9975
c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
c.bind((HOST,cPORT))
c.sendto('Hello By UDP'.encode(), (HOST,sPORT))
Out[12]: 14
  • 三种不同类型的Socket:
    1、流套接字(SOCK_STREAM):使用TCP来实现,提供可靠的、面向连接的传输服务,适用于大批量的数据
    2、数据报套接字(SOCK_DGRAM):使用UDP来实现,无连接、不可靠的数据传输服务,数据以独立报文的形式发送,效率高,适合出现差错可能性小的网络。
    3、原始套接字(SOCK_RAW):可以读写内核没有处理的IP数据报。因为流套接字只针对TCP协议,数据报套接字只针对UDP协议,若要传输其他协议发送的数据必须用原始套接字。

  • 阻塞和非阻塞通信模式
    对于发送端:都是阻塞模式,即如果底层协议没有足够的空间存放数据,则应用程序会一致等待。
    对于接收端:在阻塞模式下,若没有到达的数据,则I/O会一直阻塞等待着数据到达;在非阻塞模式下,应用程序定时查询或者有数据到达时通知程序处理。
    注:因为UDP没有发送缓冲,因此即使在阻塞模式下也不会发生阻塞,即UDP没有真正的阻塞模式。

关闭Socket

在TCP中,关闭连接比建立连接更为关键,因为涉及到两方向数据传输的断开。
如果一方直接调用.close()函数,会直接将所有数据都断掉,另一方若还有数据则无法发送。
因此采用半关闭的方式,之关闭一部分数据交换中的流,如无法发送数据,但还可以接收数据。

TCP/IP网络应用

  • DNS地址信息查询
    实现域名->IP地址的转换,DNS服务由域名空间、域名服务器和解析器三部分组成。

  • Telnet远程登陆协议
    远程登陆系统需要具备的条件:
    一个本地系统、一个远程系统、本地系统和远程系统间可以相互通信、本地系统的用户在远程多用户系统中由用户账号、本地系统和远程系统可能是不同的操作系统,因此Telnet要能运行在不同的操作系统上。
    Telnet工作模式:
    Telnet采用C/S模式,通过TCP进行通信,服务端为23端口。
    1、本地客户提出远程登陆请求,通过三次握手与远程系统建立连接。
    2、客户端Telnet向远程Telnet发数据(通过TCP协议),远程Telnet收到数据后,并不直接处理数据,而是将数据转发给内核,由内核进行处理。
    3、同时远程Telnet也接收服务端要传送的数据,发给客户端。

  • Email服务
    采用了SMTP协议,通过TCP进行通信,服务端为25端口。
    客户端邮件服务器和接收端邮件服务器建立TCP连接后,通过各种命令实现邮件服务。

  • FTP文件传输协议
    FTP用来把一台主机上的文件传到另一台主机上,基于C/S模式,通过TCP进行通信。

  • www服务和http协议
    www和http的关系:
    www:www是World Wide Web的缩写,也可以简称为Web,中文为“万维网”。是一个由许多互相链接的超文本组成的系统,通过互联网传输数据,系统中的资源由URL地址来唯一标识和访问。
    www主要是提供基于浏览器的Web服务,并不等同互联网,万维网只是互联网所能提供的服务其中之一(还有很多其他服务如FTP、Telnet、邮件服务等等)。
    http:http是HyperText Transfer Protocol的缩写,译为超文本传输协议。其设计主要是为了提供一种传输HTML页面的标准(HTML:超文本标记语言,与HTTP超文本传输协议是对应的),用于浏览器和网页服务器之间交换数据,所有的www文件都必须遵守这个标准。如一般网址前https://www.baidu.com都会有http/https。
    https:安全套接字层超文本传输协议,数据不再是明文传输,更为安全。原理:在http的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
    工作流程:
    1、用户在浏览器中输入网页的URL地址
    2、浏览器向DNS服务器发出请求,请求解析URL地址
    3、DNS服务器解析完成,向浏览器返回解析后的IP地址
    4、浏览器向对应IP地址的80端口(HTTP端口)发出建立TCP连接的请求,连接建立后即可进行数据传输。

IO复用与并行程序

IO复用

示例代码[转]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import socket, select  

s=socket.socket()
print('s:',s)
host=socket.gethostname()
port= 4321
s.bind((host,port))
s.listen(5)
#设置监听对象,最初只有当前主机(还未与客户端建立连接)
inputs=[s]
while True:
# select函数阻塞当前线程,直到监听列表的对象发生改变
# select输入参数:可读列表,可写列表,异常列表
# select返回参数:发生改变的对应列表
rs,ws,es=select.select(inputs,[],[])

for r in rs:
# 如果服务器套接字被触发,表明是出现建立新连接的请求
# 第一次触发肯定是建立新连接的情况
if r is s:
c, addr = s.accept()
print('Got connection from', addr)
# 将新建的socket加入监听列表
inputs.append(c)
# 如果客户端套接字被触发,表明是有数据传来
else:
try:
data = r.recv(1024) # 接收数据
disconnected = not data
except socket.error:
disconnected = True

if disconnected:
# data为空,表明数据已传完,断开连接,将对象移除监听列表
print(r.getpeername(),'disconnected')
inputs.remove(r)
else:
print(data)

进程和线程

进程是资源分配的单位,线程是调度运行的单位,线程共享同一进程的资源。
进程可理解为操作系统所完成的任务,线程表示完成该任务的许多可能的子任务。
创建进程:fork()函数,只在Linux平台下有,Win下没有。
创建当前进程的副本,函数之后的语句通过fork()函数返回的pid来判断是是父进程or子进程,子进程:0,父进程:子进程的进程号。
fork函数示例
在子进程中,gval复制为11,lval复制为25。
最后输出结果为:
Child Proc: 27, 13
Parent Proc: 23, 9


Post Date: 2018-05-26

版权声明: 本文为原创文章,转载请注明出处