├── CNTDA_Chapter2_Work ├── Client&Server examples │ ├── TCPClient.py │ ├── TCPServer.py │ ├── UDPClient.py │ └── UDPServer.py ├── Work1:WebServer │ ├── WebServer.py │ └── hello.html ├── Work2:UDPpinger │ ├── UDPPingerClient.py │ └── UDPPingerServer.py ├── Work3:SMTP │ └── MailClient.py └── Work4:HttpWebProxyServer │ └── ProxyServer.py ├── Kurose_Ross_Wireshark_labs_7th_ed ├── Wireshark_802.11_v7.0.pdf ├── Wireshark_DHCP_v7.0.pdf ├── Wireshark_DNS_v7.0.pdf ├── Wireshark_Ethernet_ARP_v7.0.pdf ├── Wireshark_HTTP_v7.0.pdf ├── Wireshark_ICMP_v7.0.pdf ├── Wireshark_IP_v7.0.pdf ├── Wireshark_Intro_v7.0.pdf ├── Wireshark_NAT_v7.0.pdf ├── Wireshark_SSL_v7.0.pdf ├── Wireshark_TCP_v7.0.pdf └── Wireshark_UDP_v7.0.pdf ├── Outline&Application-Layer.md ├── README.md ├── Transport-Layer.md ├── pics ├── DNS层次结构.png ├── DNS报文.png ├── DSL.png ├── FTTH.png ├── ISP互联.png ├── TCPheader.png ├── TCP关闭.png ├── TCP拥塞控制转换.png ├── TCP状态转换.png ├── TCP连接的建立和关闭.png ├── UDP头部.png ├── cookie.png ├── 代理服务器.png ├── 以太网因特网接入.png ├── 分组交换.png ├── 协议栈.png ├── 各种DNS服务器交互.png ├── 响应报文.png ├── 存储转发传输.png ├── 平均排队时延与流量强度的关系.png ├── 应用层协议.png ├── 接收窗口.png ├── 数据传输.png ├── 文件从服务器到客户的吞吐量.png ├── 混合光纤同轴接入.png ├── 滑动窗口.png ├── 电路交换.png ├── 电路交换网络中的复用.png ├── 节点时延.png ├── 请求报文.png └── 请求接收HTML.png ├── python_socket ├── GettingStarted.pdf ├── Socket1_WebServer.pdf ├── Socket2_UDPpinger.pdf ├── Socket3_SMTP.pdf ├── Socket4_ProxyServer.pdf ├── Socket5_ICMPpinger(chap4).pdf ├── Socket6_VideoStreaming(chap7).pdf └── Traceroute (Chapter 4) .pdf └── slides ├── Chapter_1_V7.01.ppt ├── Chapter_2_V7.01.ppt ├── Chapter_3_V7.01.ppt ├── Chapter_4_V7.01.ppt ├── Chapter_5_V7.01.pptx ├── Chapter_6_V7.01.pptx ├── Chapter_7_V7.0.pptx ├── Chapter_8_V7.0.pptx └── Chapter_9_V7.0.pptx /CNTDA_Chapter2_Work/Client&Server examples/TCPClient.py: -------------------------------------------------------------------------------- 1 | from socket import * 2 | serverName = 'localhost' 3 | serverPort = 12000 4 | clintSocket = socket(AF_INET, SOCK_STREAM) 5 | clintSocket.connect((serverName, serverPort)) 6 | sentence = input('Input lowercase sentence:') 7 | clintSocket.send(sentence.encode()) 8 | modifiedSentence = clintSocket.recv(1024) 9 | print('From server:', modifiedSentence.decode()) 10 | clintSocket.close() -------------------------------------------------------------------------------- /CNTDA_Chapter2_Work/Client&Server examples/TCPServer.py: -------------------------------------------------------------------------------- 1 | from socket import * 2 | serverPort = 12000 3 | serverSocket = socket(AF_INET, SOCK_STREAM) 4 | serverSocket.bind(('', serverPort)) 5 | serverSocket.listen(1) 6 | print('The server is ready to receive') 7 | while True: 8 | connectionSocket, addr = serverSocket.accept() 9 | sentence = connectionSocket.recv(1024).decode() 10 | capitalizedSentence = sentence.upper().encode() 11 | connectionSocket.send(capitalizedSentence) 12 | connectionSocket.close() -------------------------------------------------------------------------------- /CNTDA_Chapter2_Work/Client&Server examples/UDPClient.py: -------------------------------------------------------------------------------- 1 | from socket import * 2 | serverName = 'localhost' 3 | serverPort = 12000 4 | clientSocket = socket(AF_INET, SOCK_DGRAM) 5 | message = input('Input lowercase sentence:') 6 | clientSocket.sendto(message.encode(), (serverName, serverPort)) 7 | modifiedMessage, serverAddrass = clientSocket.recvfrom(2048) 8 | print(modifiedMessage.decode()) 9 | clientSocket.close() 10 | -------------------------------------------------------------------------------- /CNTDA_Chapter2_Work/Client&Server examples/UDPServer.py: -------------------------------------------------------------------------------- 1 | from socket import * 2 | serverPort = 12000 3 | serverSocket = socket(AF_INET, SOCK_DGRAM) 4 | serverSocket.bind(('', serverPort)) 5 | print('The server is ready to receive') 6 | while True: 7 | message, clientAddress = serverSocket.recvfrom(2048) 8 | modifiedMessage = message.decode().upper().encode() 9 | print(clientAddress) 10 | serverSocket.sendto(modifiedMessage, clientAddress) -------------------------------------------------------------------------------- /CNTDA_Chapter2_Work/Work1:WebServer/WebServer.py: -------------------------------------------------------------------------------- 1 | from socket import * 2 | 3 | import sys 4 | import _thread 5 | 6 | 7 | def getFileName(request): 8 | return request.split()[1][1:] 9 | 10 | 11 | def myThread(connectionSocket, addr): 12 | request = connectionSocket.recv(2048) 13 | fileName = getFileName(request.decode()) 14 | try: 15 | with open(fileName, 'r') as f: 16 | outPutData = f.read() 17 | header = 'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n' 18 | responce = header + outPutData 19 | connectionSocket.send(responce.encode()) 20 | print('{} Request success'.format(addr)) 21 | except IOError: 22 | print('{} request fail'.format(addr)) 23 | connectionSocket.send('HTTP/1.1 404 NOT FOUND\r\n'.encode('utf-8')) 24 | finally: 25 | connectionSocket.close() 26 | 27 | 28 | serverSocket = socket(AF_INET, SOCK_STREAM) 29 | serverPort = int(sys.argv[1]) 30 | serverSocket.bind(('', serverPort)) 31 | serverSocket.listen(10) 32 | print('The server is ready to receive...') 33 | while True: 34 | connectionSocket, addr = serverSocket.accept() 35 | _thread.start_new_thread(myThread, (connectionSocket, addr)) 36 | -------------------------------------------------------------------------------- /CNTDA_Chapter2_Work/Work1:WebServer/hello.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Hello

5 | 6 | 7 | -------------------------------------------------------------------------------- /CNTDA_Chapter2_Work/Work2:UDPpinger/UDPPingerClient.py: -------------------------------------------------------------------------------- 1 | from socket import * 2 | import time 3 | 4 | serverPort = 12000 5 | serverName = 'localhost' 6 | clientSocket = socket(AF_INET, SOCK_DGRAM) 7 | message = 'hello' 8 | clientSocket.settimeout(1) # 设置等待时间 9 | for i in range(10): 10 | try: 11 | begin = time.clock() 12 | clientSocket.sendto(message.encode(), (serverName, serverPort)) 13 | response = clientSocket.recv(1024) 14 | print(response.decode(), '{}ms'.format(time.clock() - begin)) 15 | except timeout: 16 | print('loss') -------------------------------------------------------------------------------- /CNTDA_Chapter2_Work/Work2:UDPpinger/UDPPingerServer.py: -------------------------------------------------------------------------------- 1 | # UDPPingerServer.py 2 | # We will need the following module to generate randomized lost packets 3 | import random 4 | from socket import * 5 | # Create a UDP socket 6 | # Notice the use of SOCK_DGRAM for UDP packets 7 | serverSocket = socket(AF_INET, SOCK_DGRAM) 8 | # Assign IP address and port number to socket 9 | serverSocket.bind(('', 12000)) 10 | while True: 11 | # Generate random number in the range of 0 to 10 12 | rand = random.randint(0, 10) 13 | # Receive the client packet along with the address it is coming from 14 | message, address = serverSocket.recvfrom(1024) 15 | # Capitalize the message from the client 16 | message = message.upper() 17 | # If rand is less is than 4, we consider the packet lost and do not respond 18 | if rand < 4: 19 | continue 20 | # Otherwise, the server responds 21 | serverSocket.sendto(message, address) -------------------------------------------------------------------------------- /CNTDA_Chapter2_Work/Work3:SMTP/MailClient.py: -------------------------------------------------------------------------------- 1 | from socket import * 2 | 3 | def receive(clientSocket): 4 | print(clientSocket.recv(1024).decode()) 5 | 6 | msg = '\r\n I love computer networks!' 7 | endmsg = '\r\n.\r\n' 8 | mailserver = 'smtp.163.com' 9 | clientSocket = socket(AF_INET, SOCK_STREAM) 10 | 11 | # 建立TCP连接 12 | clientSocket.connect((mailserver, 25)) 13 | recv = clientSocket.recv(1024) 14 | print(recv.decode()) 15 | if recv[:3] != '220': 16 | print('220 reply not received from server.') 17 | 18 | # 登录前必须发送HELO 19 | heloCommand = 'HELO Jing\r\n' 20 | clientSocket.send(heloCommand.encode()) 21 | recv1 = clientSocket.recv(1024) 22 | print(recv1.decode()) 23 | if recv1[:3] != '250': 24 | print('250 reply not received from server.'.encode()) 25 | 26 | # 登录 27 | clientSocket.send('AUTH LOGIN\r\n'.encode()) 28 | receive(clientSocket) 29 | # 邮箱base64加密 30 | clientSocket.send('dGFuZ2ppbmd5YW5nMDYwOEAxNjMuY29t\r\n'.encode()) 31 | receive(clientSocket) 32 | # 密码base64加密 33 | clientSocket.send('password\r\n'.encode()) 34 | receive(clientSocket) 35 | 36 | # 发送邮件 37 | clientSocket.send('MAIL FROM:\r\n'.encode()) 38 | receive(clientSocket) 39 | clientSocket.send('RCPT TO:\r\n'.encode()) 40 | receive(clientSocket) 41 | 42 | ## 发送内容 43 | clientSocket.send('DATA\r\n'.encode()) 44 | receive(clientSocket) 45 | clientSocket.send('From:tangjingyang0608@163.com\r\n'.encode()) 46 | clientSocket.send('To:tangjingyang0608@outlook.com\r\n'.encode()) 47 | clientSocket.send('Subject:SMTP Lab Complete!\r\n'.encode()) 48 | clientSocket.send(msg.encode()) 49 | clientSocket.send(endmsg.encode()) 50 | receive(clientSocket) 51 | 52 | # 断开连接 53 | clientSocket.send('QUIT\r\n'.encode()) 54 | receive(clientSocket) 55 | -------------------------------------------------------------------------------- /CNTDA_Chapter2_Work/Work4:HttpWebProxyServer/ProxyServer.py: -------------------------------------------------------------------------------- 1 | from socket import * 2 | 3 | serverSocket = socket(AF_INET, SOCK_STREAM) 4 | serverSocket.bind(('', 10086)) 5 | serverSocket.listen(2) 6 | 7 | while True: 8 | print('ready to serve...') 9 | connectionSocket, address = serverSocket.accept() 10 | message = connectionSocket.recv(4096).decode() 11 | print('request:\n' + message) 12 | filename = message.split()[1].partition('/')[2] 13 | print('filename:' + filename) 14 | try: 15 | f = open(filename) 16 | outputdata = f.read() 17 | connectionSocket.sendall(outputdata.encode()) 18 | except IOError: 19 | clientSocket = socket(AF_INET, SOCK_STREAM) 20 | clientSocket.connect((filename.partition('/')[0], 80)) 21 | request = message.replace(message.split()[1], '/' + filename.partition('/')[2]) 22 | print(request) 23 | request = message.replace('127.0.0.1:10086', filename.partition('/')[0]) 24 | print(request) 25 | clientSocket.sendall(request.encode()) 26 | recv = clientSocket.recv(4096) 27 | file = open('./' + filename, 'w') 28 | file.write(recv.decode()) 29 | connectionSocket.sendall(recv) 30 | clientSocket.close() 31 | file.close(); 32 | connectionSocket.close() 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_802.11_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_802.11_v7.0.pdf -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_DHCP_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_DHCP_v7.0.pdf -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_DNS_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_DNS_v7.0.pdf -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_Ethernet_ARP_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_Ethernet_ARP_v7.0.pdf -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_HTTP_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_HTTP_v7.0.pdf -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_ICMP_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_ICMP_v7.0.pdf -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_IP_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_IP_v7.0.pdf -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_Intro_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_Intro_v7.0.pdf -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_NAT_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_NAT_v7.0.pdf -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_SSL_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_SSL_v7.0.pdf -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_TCP_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_TCP_v7.0.pdf -------------------------------------------------------------------------------- /Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_UDP_v7.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/Kurose_Ross_Wireshark_labs_7th_ed/Wireshark_UDP_v7.0.pdf -------------------------------------------------------------------------------- /Outline&Application-Layer.md: -------------------------------------------------------------------------------- 1 | 2 | * [第一章:计算机网络和因特网](#第一章计算机网络和因特网) 3 | * [1.1 什么是因特网](#11-什么是因特网) 4 | * [1.1.1 具体构成描述](#111-具体构成描述) 5 | * [1.2 网络边缘](#12-网络边缘) 6 | * [1.2.1 接入网](#121-接入网) 7 | * [1.家庭接入](#1家庭接入) 8 | * [2. 企业(和家庭)接入:以太网和WIFI](#2-企业和家庭接入以太网和wifi) 9 | * [3. 广域无线接入:3g和LTE](#3-广域无线接入3g和lte) 10 | * [1.2.2 物理媒体](#122-物理媒体) 11 | * [1.3 网络核心](#13-网络核心) 12 | * [1.3.1 分组交换](#131-分组交换) 13 | * [1. 存储转发传输](#1-存储转发传输) 14 | * [2. 排队时延和分组丢失](#2-排队时延和分组丢失) 15 | * [3. 转发表和路由选择协议](#3-转发表和路由选择协议) 16 | * [1.3.2 电路交换](#132-电路交换) 17 | * [1. 电路交换网络中的复用](#1-电路交换网络中的复用) 18 | * [2. 分组交换与电路交换的对比](#2-分组交换与电路交换的对比) 19 | * [1.3.3 网络的网络](#133-网络的网络) 20 | * [1. 网络结构 1](#1-网络结构-1) 21 | * [2. 网络结构 2](#2-网络结构-2) 22 | * [3. 网络结构 3](#3-网络结构-3) 23 | * [1.4 分组交换网络中的时延、丢包和吞吐量](#14-分组交换网络中的时延丢包和吞吐量) 24 | * [1.4.1 分组交换网中的时延概述](#141-分组交换网中的时延概述) 25 | * [1.处理时延](#1处理时延) 26 | * [2. 排队时延](#2-排队时延) 27 | * [3. 传输(发射)时延](#3-传输发射时延) 28 | * [4.传播时延](#4传播时延) 29 | * [5.传输时延和传播时延比较](#5传输时延和传播时延比较) 30 | * [1.4.2 排队时延和丢包](#142-排队时延和丢包) 31 | * [1.4.3 端到端时延](#143-端到端时延) 32 | * [1.4.4 计算机网络中的吞吐量](#144-计算机网络中的吞吐量) 33 | * [1.5 协议层次及其服务模型](#15-协议层次及其服务模型) 34 | * [1.5.1 分层的体系结构](#151-分层的体系结构) 35 | * [1. 协议分层](#1-协议分层) 36 | * [OSI模型](#osi模型) 37 | * [1.5.2 封装](#152-封装) 38 | * [1.6 面向攻击的网络](#16-面向攻击的网络) 39 | * [第二章:应用层](#第二章应用层) 40 | * [2.1 应用层协议原理](#21-应用层协议原理) 41 | * [2.1.1 网络应用程序体系结构](#211-网络应用程序体系结构) 42 | * [2.1.2 进程通信](#212-进程通信) 43 | * [1. 客户和服务器进程](#1-客户和服务器进程) 44 | * [2. 进程与计算机网络之间的接口](#2-进程与计算机网络之间的接口) 45 | * [3. 进程寻址](#3-进程寻址) 46 | * [2.1.3 可供应用程序使用的运输服务](#213-可供应用程序使用的运输服务) 47 | * [2.1.4 因特网提供的运输服务](#214-因特网提供的运输服务) 48 | * [1. TCP服务](#1-tcp服务) 49 | * [2. UDP服务](#2-udp服务) 50 | * [3. 因特网运输协议所不能提供的服务](#3-因特网运输协议所不能提供的服务) 51 | * [2.1.5 应用层协议](#215-应用层协议) 52 | * [2.2 Web和HTTP](#22-web和http) 53 | * [2.2.1 HTTP概况](#221-http概况) 54 | * [2.2.2 非持续连接和持续连接](#222-非持续连接和持续连接) 55 | * [1. 采用非持续连接的HTTP](#1-采用非持续连接的http) 56 | * [2. 采用持续连接的HTTP](#2-采用持续连接的http) 57 | * [2.2.3 HTTP报文格式](#223-http报文格式) 58 | * [1. HTTP请求报文](#1-http请求报文) 59 | * [2. HTTP响应报文](#2-http响应报文) 60 | * [2.2.4 用户与服务器的交互:cookie](#224-用户与服务器的交互cookie) 61 | * [2.2.5 Web缓存](#225-web缓存) 62 | * [2.2.6 条件GET方法](#226-条件get方法) 63 | * [2.4 DNS:因特网的目录服务](#24-dns因特网的目录服务) 64 | * [2.4.1 DNS提供的服务](#241-dns提供的服务) 65 | * [2.4.2 DNS工作机理概述](#242-dns工作机理概述) 66 | * [2.4.3 DNS记录和报文](#243-dns记录和报文) 67 | 68 | 69 | 70 | 71 | 72 | # 第一章:计算机网络和因特网 73 | 74 | ## 1.1 什么是因特网 75 | 76 | ### 1.1.1 具体构成描述 77 | 78 | * **端系统** 通过 **通信链路** 和 **分组交换机** 连接到一起。 79 | * 链路的 **传输速率** 以比特/秒(bit/s,或bps)度量。 80 | * 当一台端系统向另一端系统发送数据时,发送端系统将数据分段,并为每段加上首部字节。由此形成的信息包称为 **分组**。 81 | * 分组交换机两种最著名的类型是 82 | 1. 路由器 83 | 2. 链路层交换机 84 | * **因特网服务提供商**:Internet Service Provider, ISP 85 | * **传输控制协议**:Transmission Control Protocol,TCP 86 | * **网际协议**:Internet Protocol, IP, 定义了在路由器和端系统之间发送和接收的分组格式 87 | 88 | ## 1.2 网络边缘 89 | 90 | ### 1.2.1 接入网 91 | 92 | #### 1.家庭接入 93 | 94 | * **DSL**:Digital Subscriber Line, 本地电话公司是ISP 95 | 96 | DSL调制解调器与位于电话公司的本地中心局(CO)中的数字用户线接入复用器(DSLAM)交换数据。家庭的DSL调制解调器得到数字数据后将其转换为高频音,以通过电话线传输给本地中心局;模拟信号在DSLAM处转换回数字形式。 97 | 98 | ![](./pics/DSL.png) 99 | 100 | * 电缆:cable Internet access, 有线电视公司是ISP 101 | 102 | 电缆因特网接入需要 **电缆调制解调器** (cable modem),在电缆头端,**电缆调制解调器** (CMTS)与DSLAM具有相似功能,即将下行家庭中的电缆调制解调器发送的模拟信号转换回数字形式。 103 | 104 | ![](./pics/混合光纤同轴接入.png) 105 | 106 | * 光纤到户:Fiber To The Home, FTTH,从本地中心局直接到每户设置一根光纤,实际一根光纤由许多家庭共享。分配方式有 **主动光纤网络**(Active Optical Network, AON) 和 **被动光纤网络**(Passive Optical Network, PON)。 107 | 108 | PON:每个家庭具有一个 **光纤网络端接器**(Optical Network Terminator, ONT),连接到附近的分配器(splitter),中心局中的 **光纤线路端接器** 提供光信号和电信号之间的转换。 109 | 110 | 111 | 112 | ![](./pics/FTTH.png) 113 | 114 | #### 2. 企业(和家庭)接入:以太网和WIFI 115 | 116 | ![](./pics/以太网因特网接入.png) 117 | 118 | #### 3. 广域无线接入:3g和LTE 119 | 120 | ### 1.2.2 物理媒体 121 | 122 | * **导引型媒体**(guided media) 123 | 1. 双绞铜线 124 | 2. 同轴电缆 125 | 3. 光纤 126 | 127 | * **非导引型媒体**(unguided media) 128 | 1. 陆地无线电信道 129 | 2. 卫星无线电信道 130 | 131 | ## 1.3 网络核心 132 | 133 | ### 1.3.1 分组交换 134 | 135 | * 源端系统向目的端系统发送报文,会将长报文划分为较小的数据块,称之为 **分组** 136 | 137 | * 在源和目的地之间,每个分组都通过 **通信链路** 和 **分组交换机** (主要有两类:**路由器**和**链路层交换机**)传送。 138 | * 分组以等于该链路 **最大** 传输速率的速度在通信链路上传输 139 | 140 | ![](./pics/分组交换.png) 141 | 142 | #### 1. 存储转发传输 143 | 144 | 在交换机能够开始向输出链路传输该分组的第一个比特之前,必须接收到整个分组 145 | 146 | ![](./pics/存储转发传输.png) 147 | 148 | #### 2. 排队时延和分组丢失 149 | 150 | * 对于每条相连的链路,该分组交换机有一个 **输出缓存**(output buffer,也称为 **输出队列**(output queue))。如果到达的分组传输到某条链路,但是该链路正在传输其他分组,则该分组必须在输出缓存中等待。因此除了 **存储转发时延** 以外,分组还要承受输出缓存的 **排队时延**。 151 | * 如果一个分组到达时,输出缓存已满,则该分组或已经排队的分组之一将被丢弃,此为 **丢包。** 152 | 153 | #### 3. 转发表和路由选择协议 154 | 155 | * 每台路由器具有一个 **转发表** ,用于将目的地址(或目的地址的一部分)映射成为输出链路。 156 | * **路由选择协议**(routing protocol)用于自动设置转发表。 157 | 158 | ### 1.3.2 电路交换 159 | 160 | ![](./pics/电路交换.png) 161 | 162 | * 网络链路和交换机移动数据的两个基本方法:**电路交换**(circuit switching),**分组交换**(packet switching)。 163 | * **电路交换**中,在端系统通信会话期间,预留了端系统间沿路径通信所需要的资源(缓存、链路传输率)。而在 **分组交换** 中是不预留的。 164 | * 传统电话网络就是电路交换的一个例子,在发送方和接收方建立连接时,该路径上所有的交换机都将为该连接维护连接状态,该连接称为 **电路**(circuit) 165 | 166 | #### 1. 电路交换网络中的复用 167 | 168 | * 链路中的电路是通过 **频分复用**(Frequency-Division Multiplexing, FDM)和 **时分复用**(Time-Division Multiplexing, TDM) 实现的。 169 | 170 | * FDM:连接期间链路为每条连接专用一个频段,频段宽度称为 **带宽**(band-width)。调频无线电台就是使用FDM来共享88MHz~108MHz。 171 | * TDM:时间被划分为固定期间的 **帧**(frame),每个帧又被划分为固定数量的 **时隙**(slot)。当网络跨越一条链路创建一个连接时,网络在每个帧中为该连接指定一个时隙专门由该连接单独使用。 172 | 173 | ![](./pics/电路交换网络中的复用.png) 174 | 175 | #### 2. 分组交换与电路交换的对比 176 | 177 | 分组交换性能能够优于电路交换的性能,发展趋势也是向着分组交换。 178 | 179 | ### 1.3.3 网络的网络 180 | 181 | #### 1. 网络结构 1 182 | 183 | 假想用单一 **全球传输ISP**(提供商, provider)互联所有 **接入ISP**(客户,customer) 184 | 185 | #### 2. 网络结构 2 186 | 187 | 由数十万接入ISP和多个全球传输ISP组成,多个全球传输ISP必须是互联的。 188 | 189 | #### 3. 网络结构 3 190 | 191 | 第一层不仅有多个竞争ISP,在一个区域也可能有多个竞争ISP,比如中国,每个城市有接入ISP,他们与省级ISP连接,省级ISP又与国家级ISP连接,国家级ISP最终与第一层ISP连接。 192 | 193 | ![](./pics/ISP互联.png) 194 | 195 | ## 1.4 分组交换网络中的时延、丢包和吞吐量 196 | 197 | **吞吐量**:每秒钟能够传送的数据量 198 | 199 | ### 1.4.1 分组交换网中的时延概述 200 | 201 | ![](./pics/节点时延.png) 202 | 203 | #### 1.处理时延 204 | 205 | 检查分组首部和决定该分组导向何处所需要的时间是其一部分,也包括其他因素,比如检查比特级别的差错所需要的时间。 206 | 207 | #### 2. 排队时延 208 | 209 | 一个特定的分组的排队时延长度将取决于先期到达的正在排队等待向链路传输的分组数量。 210 | 211 | #### 3. 传输(发射)时延 212 | 213 | L比特表示分组长度,R bps表示从路由器A到路由器B的链路传输速率。则传输时延是 L/R。 214 | 215 | #### 4.传播时延 216 | 217 | 两台路由器之间的距离除以传播速率 (d/s) 218 | 219 | #### 5.传输时延和传播时延比较 220 | 221 | 传输时延是路由器推出分组所需要的时间,是分组长度和链路传输速率的函数,与两台路由器距离无关。传播时延是一个比特从一台路由器传播到另一台路由器所需的时间,是两台路由器间距离的函数,与分组长度和链路传输速率无关。 222 | 223 | ### 1.4.2 排队时延和丢包 224 | 225 | * 令 a 表示分组到达队列的平均速率(分组/秒)。R 是传输速率(bps)。每个分组由 L 比特组成。则 La/R 被称为 **流量强度**(traffic intensity)。流量强度不能大于1,否则排队时延趋于无限大。 226 | 227 | ![](./pics/平均排队时延与流量强度的关系.png) 228 | 229 | * 随着流量强度接近于1,排队时延并不是真正趋向无穷大,相反,到达的分组将发现一个满的队列,由于没地方储存这个分组,路由器将丢弃(drop)该分组,该分组会丢失(lost)。 230 | 231 | ### 1.4.3 端到端时延 232 | 233 | dend-end = N(dproc + dtrans + dprop) 234 | 235 | ### 1.4.4 计算机网络中的吞吐量 236 | 237 | 主机A到主机B跨越计算机网络传送一个大文件。 238 | 239 | * 任何时间瞬间的 **瞬时吞吐量** 是主机B接收到文件的速率(bps计) 240 | 241 | * 如果文件由F比特组成,主机B接收到所有F比特用去T秒,则文件传送的 **平均吞吐量** 是F/T bps。 242 | 243 | * 对于简单的两链路网络,其吞吐量是min{Rc, Rs},它是 **瓶颈链路**。 244 | 245 | ![](./pics/文件从服务器到客户的吞吐量.png) 246 | 247 | 对应图 b. 文件传输吞吐量是{R1, R2, ... , RN}。 248 | 249 | * 吞吐量取决于数据流过的链路的传输速率还有干扰流量。 250 | 251 | ## 1.5 协议层次及其服务模型 252 | 253 | ### 1.5.1 分层的体系结构 254 | 255 | #### 1. 协议分层 256 | 257 | ![](./pics/协议栈.png) 258 | 259 | 各层的所有协议被称为协议栈(protocol stack),因特网的协议栈由5各层次组成:物理层、链路层、网络层、运输层、应用层。 260 | 261 | (1) 应用层 262 | 263 | * 应用层是网络应用程序及它们的应用层协议存留的地方。协议比如有 **HTTP**(提供了Web文档的请求和传送)、**SMTP**(提供了电子邮件报文的传输)和 **FTP**(提供两个端系统之间的文件传送)。**DNS** 域名系统。 264 | 265 | * 位于应用层的信息分组称为 **报文**。 266 | 267 | (2) 运输层 268 | 269 | * 因特网的运输层在应用程序端点之间传送应用层报文。 270 | * 两种运输协议,**TCP** 和 **UDP** 。 271 | * **TCP**:向应用程序提供面向连接的服务。包括应用层报文向目的地的确保传递和流量控制(发送方/接收方速率匹配)。TCP 也将长报文划分为短报文,并提供拥塞控制机制,网络拥塞时,源会抑制其传输速率。 272 | * **UDP**:向应用程序提供无连接服务。这是一种不提供不必要服务的服务,没有可靠性,没有流量控制,也没有拥塞控制。 273 | * 运输层的分组称为 **报文段**。 274 | 275 | (3) 网络层 276 | 277 | * 网络层负责将称为 **数据报**(datagram)的网络层分组从一台主机移动到另一台主机。源主机中的运输层协议(TCP UDP)向网络层递交运输层**报文段**和**目的地址** 278 | * 包含 **网际协议IP**,定义了在数据报中的各个字段以及端系统和路由器如何作用于这些字段。 279 | * 包含 **路由选择协议** 根据该路由将数据报从源传输到目的地。 280 | 281 | (4) 链路层 282 | 283 | * 网络层将数据报下传给链路层,链路层沿着路径将数报传递给下一个级节点,在下一个节点,链路层将数据报上传给网络层。 284 | 285 | * 链路层分组称为 **帧**(frame) 286 | 287 | (5) 物理层 288 | 289 | 物理层任务是将该帧中的一个个比特从一个节点移动到下一个节点。 290 | 291 | #### OSI模型 292 | 293 | 7层:应用层、表示层、会话层、运输层、网络层、链路层、物理层。 294 | 295 | ### 1.5.2 封装 296 | 297 | ![](./pics/数据传输.png) 298 | 299 | * 运输层收取到报文并附上附加信息 Ht 构成运输层报文段 300 | * 网络层收取到报文段,增加源和目的端系统地址等网络层首部信息 Hn 构成网络层数据报 301 | * 链路层收取到数据报,增加自己的链路层首部信息 Hl 构成链路层帧 302 | * 一个分组分为 首部字段 和 **有效载荷字段**(来自上一层的分组) 303 | 304 | ### 1.6 面向攻击的网络 305 | 306 | * **拒绝服务攻击**:DoS (Denial-of-Service Attack) 307 | 308 | * **分布式DOS**(Distributed DoS, DDoS) 309 | 310 | 311 | # 第二章:应用层 312 | 313 | ## 2.1 应用层协议原理 314 | 315 | ### 2.1.1 网络应用程序体系结构 316 | 317 | * **客户-服务器体系结构**:有一个总打开的主机称为服务器,服务与来自许多称为客户的主机请求。 318 | * **P2P体系结构**:对位于数据中心的专用服务器有最小或者没有依赖,应用程序在间断连接的主机对之间直接使用通信,其中主机对称为 **对等方**。 319 | 320 | ### 2.1.2 进程通信 321 | 322 | #### 1. 客户和服务器进程 323 | 324 | 对每对通信进程,一个标识为 **客户**(client),另一个表示为 **服务器**(server)。发起会话的是客户,等待联系的是服务器。 325 | 326 | #### 2. 进程与计算机网络之间的接口 327 | 328 | * **套接字**:同一台主机中应用层和运输层之间的接口,也被称为应用程序和网络之间的应用程序编程接口(Application Programming Interface, API)。 329 | 330 | #### 3. 进程寻址 331 | 332 | * 主机由 **IP地址** 标识。 333 | * 接收进程由 **端口号** 标识。 334 | 335 | ### 2.1.3 可供应用程序使用的运输服务 336 | 337 | 1. 可靠数据传输 338 | 2. 吞吐量 339 | 3. 定时 340 | 4. 安全性 341 | 342 | ### 2.1.4 因特网提供的运输服务 343 | 344 | #### 1. TCP服务 345 | 346 | * 面向连接的服务:应用层报文开始流动之前,TCP让客户和服务器互相交换运输层控制信息。 347 | * 可靠的数据传送服务:应用程序一端将字节流传进套接字时,TCP能将相同的字节流交付给接收方。 348 | * 拥塞控制机制:网络拥塞时,会抑制发送进程。 349 | * TCP加强版 **安全套接字层**(Secure Sockets Layer, SSL),SSL不是第三种运输协议,而是对TCP的一种加强。 350 | 351 | #### 2. UDP服务 352 | 353 | 无握手过程,提供不可靠数据传送服务,报文可能乱序到达,无拥塞机制。 354 | 355 | #### 3. 因特网运输协议所不能提供的服务 356 | 357 | 吞吐量和定时没有被提供 358 | 359 | ![](./pics/应用层协议.png) 360 | 361 | 362 | 363 | ### 2.1.5 应用层协议 364 | 365 | 应用层协议定义了: 366 | 367 | * 交换的报文类型,例如GET POST 368 | * 报文类型的语法 369 | * 字段的信息含义 370 | * 何时以及如何发送报文 371 | 372 | ## 2.2 Web和HTTP 373 | 374 | ### 2.2.1 HTTP概况 375 | 376 | * Web的应用层协议是 **超文本传输协议**(HyperText Transfer Protocol, HTTP) 377 | * HTTP服务器不保存客户任何信息,所以HTTP是一个 **无状态协议**(stateless protocol) 378 | 379 | ### 2.2.2 非持续连接和持续连接 380 | 381 | * **非持续连接(non-persisent connection)**:每次请求/响应是经过一个单独的TCP进行的。 382 | 383 | * **持续连接(persistent connection)**:所有请求和响应经过同一TCP进行。 384 | * **RTT**:(Round-Trip Time)往返时间 385 | 386 | #### 1. 采用非持续连接的HTTP 387 | 388 | ![](./pics/请求接收HTML.png) 389 | 390 | 三次握手,前两部分占用一个RTT 391 | 392 | 总的响应时间是两个RTT加上服务器传输HTML文件的时间。 393 | 394 | #### 2. 采用持续连接的HTTP 395 | 396 | 一个完整的web页面可用单个TCP连接进行传送 397 | 398 | 同一服务器的多个web页面可用单个TCP连接进行传送 399 | 400 | ### 2.2.3 HTTP报文格式 401 | 402 | #### 1. HTTP请求报文 403 | 404 | > GET /somedir/page.html HTTP/1.1 405 | > Host: www.someschool.edu 406 | > 407 | > Connection: close 408 | > User-agent: Mozilla/5.0 409 | > Accept-language: fr 410 | 411 | HTTP请求报文第一行叫作 **请求行**(request line), 后继行叫作 **首部行**(header line) 412 | 413 | * 请求行有三个字段: 414 | 415 | * 方法字段:GET、POST、HEAD、PUT、DELETE 416 | 417 | * URL字段 418 | 419 | * HTTP版本字段 420 | 421 | ![](./pics/请求报文.png) 422 | 423 | #### 2. HTTP响应报文 424 | 425 | >HTTP/1.1 200 OK 426 | >Connection: close 427 | > 428 | >Date: Tue, 09 Aug 2011 15:44:04 GMT 429 | >Server: Apache/2.2.3 (CentOS) 430 | >Last-Modified: Tue, 09 Aug 2011 15:11:03 GMT 431 | >Content-Length: 6821 432 | >Content-Type: text/html 433 | >(data data data data data ...) 434 | 435 | 一个初始 **状态行**(status line),6个 **首部行**(header line),然后是 **实体体**(entity body) 436 | 437 | ![](./pics/响应报文.png) 438 | 439 | ### 2.2.4 用户与服务器的交互:cookie 440 | 441 | ![](./pics/cookie.png) 442 | 443 | ### 2.2.5 Web缓存 444 | 445 | * **Web缓存器**(Web cache)也叫 **代理服务器**(proxy server) 446 | 447 | ![](./pics/代理服务器.png) 448 | 449 | ### 2.2.6 条件GET方法 450 | 451 | * **条件GET**(conditional GET):HTTP协议的一种机制,允许缓存器证实它的对象是最新的。 452 | 453 | * 如果报文使用的是GET方法并且请求报文中包含一个"If-Modifed-Since:"首部行,则这个HTTP请求报文是条件GET请求报文。 454 | * 由缓存服务器向目的服务器发送,如果请求的资源没有改变,目的服务器会回复 304 Not Modified 响应报文。 455 | 456 | ## 2.4 DNS:因特网的目录服务 457 | 458 | * **主机名**(hostname) 459 | * **IP地址**(IP Address) 460 | 461 | ### 2.4.1 DNS提供的服务 462 | 463 | * **DNS**(Domain Name System): 464 | 465 | * 是一个由分层的DNS服务器实现的分布式数据库。 466 | 467 | * 是一个使得主机能够查询分布式数据库的应用层协议。 468 | 469 | * DNS服务器通常是运行BIND(Berkeley Internet Name Domain)软件的UNIX机器。 470 | * 运行在UDP之上,使用53号端口。 471 | 472 | * 提供的服务: 473 | 474 | 1. 主机名到IP地址的转换 475 | 2. **主机别名**(host aliasing):复杂主机名的主机能拥有一个或多个别名原名叫做 **规范主机名**(canonical hostname)。 476 | 3. **邮件服务器别名**(mail server aliasing):MX记录允许邮件服务器和Web服务器使用相同的主机名 477 | 4. **负载分配**(load distribution):部署在分布式服务器的站点有多个IP,所以一个IP集合与一个规范主机名相联系。DNS服务器数据库中储存着这个集合,每次收到该主机名的DNS请求时,DNS服务器会用整个IP集合响应,但是每次都会循环这些IP的次序。 478 | 479 | ### 2.4.2 DNS工作机理概述 480 | 481 | 1. 分布式、层次数据库 482 | 483 | ![](./pics/DNS层次结构.png) 484 | 485 | * **根DNS服务器**:提供顶级域服务器地址。 486 | * **顶级域服务器**(Top-level Domain, TLD):提供权威DNS服务器地址。 487 | * **权威DNS服务器**:提供公共可访问主机的IP地址。 488 | 489 | ![](./pics/各种DNS服务器交互.png) 490 | 491 | 2. DNS缓存(DNS caching) 492 | 493 | DNS服务器接收到DNS回答能将映射缓存到本地存储器中。 494 | 495 | ### 2.4.3 DNS记录和报文 496 | 497 | * DNS服务器存储了 **资源记录**(Resource Record,RR),提供了主机名到IP地址的映射。RR是一个4元组(Name, Value, Type, TTL),TTL决定该缓存删除的时间。Name和Value由Type决定。 498 | * 如果 Type = A, 则 Name是主机名,Value是对应的IP地址。 499 | * 如果 Type = NS, 则Name是域,Value是权威DNS服务器主机名。 500 | * 如果 Type = CNAME,则Value是个别名为Name的主机的规范主机名 501 | * 如果 Type = MX,则Value是个别名为Name的邮件服务器的规范主机名 502 | 503 | * DNS报文 504 | 505 | ![](./pics/DNS报文.png) 506 | 507 | 508 | 509 | 510 | # Http协议 511 | [参考](https://segmentfault.com/a/1190000015969377) 512 | ## Http 0.9 513 | 最早的一个版本,只支持GET 514 | ## Http 1.0 515 | 每个tcp连接只能发送一个请求,可以使用keep-alive选项解决 516 | ## Http 1.1 517 | 长连接:tcp默认不关闭,每个站点允许建立6个持久连接,默认开启keep-alive 518 | 管道机制:在同一个TCP连接里,可以同时发送多个请求。但是服务器还是要按照请求的顺序进行响应,会造成“队头阻塞”。 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Computer Networking Notes 2 | 3 | * Computer Networking Top-Down Approach, 7th 4 | * TCP/IP Illustrated Volume 1, 2nd 5 | --- 6 | * [Outline&Application Layer](Outline&Application-Layer.md) 7 | * [Transport Layer](Transport-Layer.md) 8 | -------------------------------------------------------------------------------- /Transport-Layer.md: -------------------------------------------------------------------------------- 1 | # TCP(Transmission Control Protocol)传输控制协议 2 | 3 | ## TCP头部结构 4 | ![](./pics/TCPheader.png) 5 | 基础的TCP头部长度以32位字为单位,共20Bytes 6 | * 客户端端口和服务端端口(16bits * 2) 7 | * 序列号(32bits) 8 | TCP为每个字节赋予一个序列号,一个TCP头中的序列号标识着该报文段中数据的第一个字节。 9 | * ACK号(32bits) 10 | 最后被成功接收到的数据字节的序列号+1。 11 | tip:发送一个ACK与发送任何一个TCP报文段的开销是一样的,因为ACK号字段和ACK位字段都是头部的一部分。 12 | * 头部长度(4bits) 13 | 因为TCP头部有可选项,所以长度是不确定的,需要该字段注明头部长度。以32位字为单位,所以四位表示范围0~60Bytes,也就是TCP头部被限制在60Bytes,而基础不含选项的头部为20Bytes。 14 | * 保留字段(4bits) 15 | * 标志位(8bits) 16 | * CWR 拥塞窗口减 (发送方降低它的发送速率) 17 | * ECE ECN回显 (发送方接收到了一个个更早的拥塞通告) 18 | * URG 紧急 (紧急指针字段有效),此标志位很少被使用。 19 | * ACK 确认 (确认号字段有效),TCP连接建立一般都是启用状态。 20 | * PSH 推送 (告知接收方应该尽快将数据推送给应用程序) 21 | * RST 重置连接 (遇到错误,连接取消) 22 | * SYN 初始化连接的同步序列号。 23 | * FIN 发送方告知接收方已经结束发送数据,要关闭连接。 24 | * 窗口大小(16bits) 25 | 告知想接受的数据大小,以Bytes为单位,16bits限制了数据大小在65535Bytes。 26 | * 校验和(16bits) 27 | 发送方计算和保存,接收方验证 28 | * 紧急指针(16bits) 29 | 让发送方给另一端提供特殊标志数据 30 | * 选项字段(最大40Bytes) 31 | * SACK选项可以记录丢包的区间,可以让发送端一次发送所有丢失的分组,而不是一个一个快速重传。 32 | ## TCP连接的建立和关闭 33 | ![](pics/TCP连接的建立和关闭.png) 34 | * TCP连接的建立(三次握手) 35 | 1. 主动开启者(通常为客户端)向被动开启者发送一个SYN,并且附上初始序列号ISN(c)。 36 | 2. 被动开启者收到后也发送一个SYN,并且附上ACK,ACK号为ISN(c)+1,还附上了被动开启者的初始序列号ISN(s)。 37 | 3. 主动开启者收到SYN后,返回一个ACK,序列号为ISN(c)+1,ACK号为ISN(s) + 1; 38 | 39 | (以上的报文段中都可带选项) 40 | **注意**:初始序列号可视为一个32位计数器,每4微秒加1,防止与其他连接序列号重叠。 41 | **为什么需要三次握手?** 42 | 倘若只有两次握手(客服端发送SYN,服务端回一个ACK,就建立一个TCP连接),那么当SYN在网络中滞留很久后,客户端重传了这个SYN,最后服务端可能会收到两个SYN,就会错误地建立两个TCP连接。所以必须要第三次握手,让客户端确认一下,再建立起连接。 43 | 44 | * TCP连接的关闭(四次挥手) 45 | 1. 主动关闭者发送一个FIN报文段,其中还有一个序列号K,一个ACK(ACK号为L)用来确认最近一次收到的数据。 46 | 2. 被动关闭者收到FIN段后,回复一个ACK,序列号为L,ACK号为K+1 47 | 3. 被动关闭者接着发送一个FIN段,序列号为L,ACK号为K+1 48 | 4. 主动关闭者收到后回复一个ACK,序列号为K,ACK号为L+1 49 | 50 | (以上的报文段中都可带选项) 51 | **为什么需要四次挥手?** 52 | 前两次挥手后,也就是被动关闭端确认了主动关闭端的FIN后,会进入CLOSE_WAIT状态,在这个状态下,是为了等待发送完还没有发完的数据,发完后才会发送一个自己的FIN(第三次握手),告知主动关闭端我的数据已经发完了,马上也要关闭了,被动关闭端当然需要确认主动关闭端已经知道自己数据发送完了(避免FIN丢失),所以会等主动关闭端的ACK(第四次握手)。 53 | 54 | ## TCP状态转换 55 | ![](pics/TCP状态转换.png) 56 | 57 | 建立连接: 58 | * TCP初始化时状态为`CLOSED`, 如果是主动打开方会快速发送一个SYN转换为`SYN_SENT`状态,如果是被动打开方,会快速转换为`LISTEN`状态。 59 | * `LISTEN`状态收到SYN后,返回一个SYN+ACK,进入`SYN_RCVD`状态。 60 | * `SYN_SENT`状态收到SYN_ACK,发送一个ACK,进入`ESTABLISHED`状态。 61 | * `SYN_RCVD`状态收到ACK,进入`ESTABLISHED`状态。 62 | 63 | 同时建立连接: 64 | * 两方同时发送SYN,由`CLOSED`状态进入`SYN_SENT`状态。 65 | * 两方接收到SYN后发送SYN+ACK,由`SYN_SENT`状态进入`SYN_RCVD`状态。 66 | * 两方接收到SYN+ACK,发送ACK,`SYN_RCVD`进入`ESTABLISHED`状态。 67 | 68 | 关闭连接: 69 | ![](pics/TCP关闭.png) 70 | * 主动关闭方和被动关闭方都从`ESTABLISHED`状态开始。 71 | * 主动关闭方发送一个FIN,`ESTABLISHED`->`FIN_WAIT_1` 72 | * 被动关闭方收到FIN,回复一个此FIN的ACK,`ESTABLISHED`->`CLOSE_WAIT` 73 | * 主动关闭方收到ACK,`FIN_WAIT_1`->`FIN_WAIT_2` 74 | * 被动关闭方发送一个FIN,`CLOSE_WAIT`->`LAST_ACK` 75 | * 主动关闭方收到FIN,回复一个此FIN的ACK,`FIN_WAIT_2`->`TIME_WAIT` 76 | * 被动关闭方收到ACK,`LAST_ACK`->`CLOSED` 77 | 78 | 同时关闭: 79 | * 主动关闭方和被动关闭方都从`ESTABLISHED`状态开始。 80 | * 双方都发送一个FIN,`ESTABLISHED`->`FIN_WAIT_1` 81 | * 都收到FIN,回复此FIN的ACK,`FIN_WAIT_1`->`CLOSING` 82 | 都收到ACK,`CLOSING`->'`TIME_WAIT` 83 | 84 | **TIME_WAIT的作用** 85 | 1. 在TCP主动关闭方发送最后一个ACK时会进入`TIME_WAIT`而不是直接进入`CLOSED`,`TIME_WAIT`状态会保持2msl(2 maximun segment lifetime)的时长,一个msl是IP数据报在被接收前能够在网络中存活的最大时间。之所以要2msl的时间是考虑到:最后一个ACK丢失,被动方重传FIN,希望能收到ACK,这个过程完成的时间在极端情况下就是2msl 86 | **注意**:`TIME_WAIT`只是尽可能保证TCP全双工连接的终止,因为被动方重传的FIN也可能丢失,导致2msl过了被动方也没能收到此FIN的ACK 87 | 2. TCP的一条连接由一个四元组(src_ip, src port, dst_ip, dst_port)标识,当处于`TIME_WAIT`时,此条连接会被定义为不可使用,这样就避免了一条连接关闭后能立即生成同一条连接,接收到上一次连接的分组。 88 | 89 | **避免TIME_WAIT** 90 | `SO_REUSEADDR`这个套接字选项允许分配处于`TIME_WAIT`的端口来建立TCP连接。这一点违背了TCP的最初规范,但是只要能保证不会收到上一条连接分组的干扰,就可以使用。 91 | 92 | ## 超时重传 93 | TCP超时重传的基础就是需要根据RTT(Round-Trip Time)分组往返时间设置RTO(Retransmission Timeout)超时重传时间。 94 | 上述过程有以下方法: 95 | * 经典方法 96 | SRTT = a(SRTT) + (1-a)RTT,其中a取0.8-0.9,SRTT为平滑RTT估计值,RTT为新测的一个RTT样本。得到新的SRTT后,RTO = min(ubound, max(lbound, (SRTT)b)),其中ubound是RTO的上边界,lbound为RTO下边界,b为时延离散因子,通常为1.3-2.0。 97 | 此方法在RTT波动较大的网络中,效果很差。 98 | * 标准方法 99 | 基于平滑RTT和平滑偏差计算 100 | (平滑RTT)srtt = (1-g)srtt + gM 101 | (平滑偏差)rttvar = (1-h)rttvar + h(|M-srttt|) 102 | RTO = srtt + 4rttvar 103 | 104 | ## 快速重传 105 | 根据收到冗余的ACK来判断是否发生丢包,通常冗余ACK的数量有个阈值dupthresh(常量3),到这个值时,大概率产生丢包,发生重传。 106 | 107 | **一个重传尝试到一定次数后会判断连接故障,关闭连接。** 108 | 109 | ## 重传二义性和karn算法 110 | * 当重传了一个数据包后,收到一个确认,该确认可能是第一次传输的确认也可能是重传的确认。 111 | * 很明显根据此确认计算RTT可能不是准确的,所以karn算法第一部分规定,接收重传的确认时,不更新RTT估计值。 112 | * 每重传一次,计算RTO的退避系数加倍,这是karn算法的第二部分。 113 | 114 | # 数据流与窗口管理 115 | 116 | ## 延时确认 117 | 大多数情况下,TCP不会为每个受到的数据包返回一个ACK,而是累计收到多个后,返回一次ACK,但是为了避免引发重传,延时理论值最高为500ms,实际中最大取的是200ms。 118 | 119 | ## Nagle算法 120 | 为了减少网络中微型包的数量,引入了nagle算法。 121 | * 一个TCP连接中只允许有一个小于MSS的报文段在传输,在该报文段的ACK到达之后,TCP会收集小数据并整合为在一个报文段中再发送。 122 | 123 | ### 延时ACK和Nagle算法 124 | 若两者结合使用,结果可能会很不理想。比如说客户端使用延时ACK,服务端使用nagle算法,当服务端发送了一个小包后,会一直等这个包的ACK,而客户端接收到这个小包后进入延时ACK的计时器,希望有新的数据包捎带此ACK回复给服务端,这样两者会互相等待对方,造成暂时性死锁。 125 | **禁用nagle**:设置TCP_NODELAY选项。 126 | 127 | ## 流量控制 128 | 发送端根据接收端发送的报文段中的窗口大小字段,来动态调整发送数据的大小。基于窗口实现。 129 | ### 滑动窗口 130 | ![](pics/滑动窗口.png) 131 | 1. 关闭:窗口左边界右移。当已发送的数据收到ACK时,窗口会减小。 132 | 2. 打开:窗口右边界右移。当已确认数据得到处理,窗口会变大。 133 | 3. 收缩:窗口右边界左移。不支持这种做法。 134 | 135 | ### 接收窗口 136 | ![](pics/接收窗口.png) 137 | 到达的序列号小于RCV.NXT或大于RCV.NXT+RCN.WND则丢弃。只有序列号等于RCV.NXT时,窗口才会向右移动 138 | 139 | ### 零窗口和持续计时器 140 | 当接收端的窗口值变为0时,会通知给发送端,直到应用程序处理数据,窗口重新获得可用空间时,会给发送端发一个窗口更新(一个纯ACK),不保证传输可靠,所以如果丢失,双方都会等待,发送方等待窗口更新,接收方等待接收数据。为了避免此死锁发生,TCP引入了 **持续计时器**。 141 | * 当发送端收到零窗口通告时,会开启持续计数器,间歇性的发送窗口探测,强制要求接收端回复一个ACK(包含了窗口大小)查询接收端的窗口是否增长。一般在第一个RTO后发送第一个窗口探测,随后采用指数规避发送窗口探测。 142 | 143 | ### 糊涂窗口综合征(silly window syndrome) 144 | 发生该问题的时候,TCP交换的不是全长包,而是一些小包,小包传输代价相对大,传输效率很低。 145 | 出现原因: 146 | * 接收端通告窗口太小 147 | * 发送端发送的数据较小 148 | 149 | 应对: 150 | * 接收端:窗口增至可以放下一个全长报文段,或者接收端缓存的一半(两者中较小者)的时候才能开始发送新窗口通告。 151 | * 发送端:1.可以发送一个全长报文段 2.可以发送数据段长度 >= 接收端通告过的最大窗口值的一半的报文段 3.当禁用了Nagle算法或者所有发出的数据都已经被对端ACK确认的话,那么TCP可以发送小数据包 152 | 153 | # 拥塞控制 154 | 拥塞控制和流量控制很像,但是后者是为了控制发送端的发送速率,避免接收端收到的数据溢出,而拥塞控制是为了降低网络中的拥塞程度。 155 | 156 | 发送端维护着一个拥塞窗口(congestion window, cwnd),发送端实际上可发送窗口大小为 W = min(cwnd, awnd), 其中awnd为接收端通告窗口。对于这个W,我们是希望它能够接近带宽延迟积(bandwidth-delay product, BDP),W也称作最佳窗口大小。 157 | 158 | TCP拥塞控制主要有以下算法: 159 | * 慢启动 160 | * 拥塞避免 161 | * 快重传 162 | * 快恢复 163 | ![](pics/TCP拥塞控制转换.png) 164 | ## 慢启动 165 | * 在一个TCP连接刚建立时,或者重传计时器检测到网络中产生丢包后,会执行慢启动。因为在这两种情况下不知道网络传输能力(cwnd的值),所以需要先得到一个cwnd的初值。而得到cwnd初值的方法就是以越来越快的速度不断发送数据,直到丢包为止。 166 | * 但是考虑到如果一开始就以一个很大的速率发送,肯定会影响到其他连接的传输性能,所以采用慢启动的方式。 167 | 168 | 慢启动的过程: 169 | 刚开始cwnd通常设置为1MSS,每收到一个新的报文段的ACK,cwnd增加一个MSS,所以cwnd随着每个RTT的变化就是1MSS,2MSS,4MSS,8MSS...呈**指数**级增长。但是一直这样下去cwnd过大后,肯定会引起网络拥塞,所以要在一个慢启动阈值(ssthresh)转换为拥塞避免模式。 170 | 当 cwnd < ssthresh 时,使用慢启动算法。 171 | 当 cwnd > ssthresh 时,停止使用慢启动而改用拥塞避免算法。 172 | 当 cwnd = ssthresh 时,既可使用慢慢启动,也可使用拥塞控制避免算法。 173 | 174 | ## 拥塞避免 175 | 在拥塞避免模式下,每收到一个新的报文段的ACK,cwnd会增加 MSS*(MSS/cwnd) 字节的大小,也就是说每经过一个RTT,cwnd只会增加一个MSS的大小,相比于慢启动的指数级增长,现在变成了**线性**增长,速率要缓慢很多 176 | 177 | ## 快速恢复 178 | 不论是在慢启动或者是拥塞避免阶段,只要出现一个由超时指示的丢包事件,那么ssthreth会被设置为cwnd的一半,cwnd被设置为1,进入**慢启动模式**。但是出现一个由三个冗余ACK指示的丢包事件时,ssthreth被设置为cwnd的一半,而cwnd减半并加上三个MSS(一个MSS对应一个冗余ACK),然后进入**快速恢复模式**。 179 | 上述快速恢复算法是TCP较新版本TCP Reno,以前的老版本TCP Tahoe,不论是因为超时丢包还是冗余ACK丢包,cwnd都会被设置为1MSS。 180 | 181 | # 保活机制 182 | 一个TCP连接建立后,即使没有任何数据交互这个连接也会一直存在,这无疑会浪费大量资源。所以引入保活定时器来探测连接对方是否发生了异常,以此判断连接是否可以关闭。 183 | 开启keep alive功能的一方维护着一个保活定时器,当计时经过一个 **保活时间(keepalive time)** 连接处于非活动状态,则挥发送一个保活探测报文,如果超过一个 **保活时间间隔(keepalive interval)** 没有收到探测报文的响应,会再次发送探测报文,直到发送了 **保活探测数(keepalive probe)** 次后,对方会被认为出现异常,该连接可以关闭了。 184 | **Linux下** 185 | * 保活时间 默认为2h 186 | * 保活时间间隔 默认为75s 187 | * 保活探测数 默认为9次 188 | 189 | ## 四种超时计时器 190 | 1. 超时重传计时器,每发送一个报文,就会开启一计时 191 | 2. TIME_WAIT计时器,2msl 192 | 3. 保活计时器,TCP连接建立后开始计时,每发生一次信息传输就重置0,当计时到一定时间服务端会发送探测报文,判断客户端是否还活着 193 | 4. 坚持计时器当接受方发送了0窗口告知后,发送方就会不再发送数据,并且开始等待窗口更新,但是窗口更新的报文可能丢失,所以发送端被告知0窗口后,就会开一个坚持计时器,间歇发送探测报文给接收端查询窗口大小。 194 | 195 | 196 | # UDP(User Datagram Protocol)用户数据报协议 197 | 198 | ## UDP头部 199 | ![](pics/UDP头部.png) 200 | * 源端口号(2字节) 201 | * 目的端口号(2字节) 202 | * 长度(2字节) 203 | * 校验和(2字节) 204 | 205 | UDP由一个二元组标识(目的IP,目的PORT) 206 | 207 | # 两者比较 208 | * UDP是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。 209 | 210 | * TCP是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。 211 | 212 | 213 | -------------------------------------------------------------------------------- /pics/DNS层次结构.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/DNS层次结构.png -------------------------------------------------------------------------------- /pics/DNS报文.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/DNS报文.png -------------------------------------------------------------------------------- /pics/DSL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/DSL.png -------------------------------------------------------------------------------- /pics/FTTH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/FTTH.png -------------------------------------------------------------------------------- /pics/ISP互联.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/ISP互联.png -------------------------------------------------------------------------------- /pics/TCPheader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/TCPheader.png -------------------------------------------------------------------------------- /pics/TCP关闭.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/TCP关闭.png -------------------------------------------------------------------------------- /pics/TCP拥塞控制转换.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/TCP拥塞控制转换.png -------------------------------------------------------------------------------- /pics/TCP状态转换.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/TCP状态转换.png -------------------------------------------------------------------------------- /pics/TCP连接的建立和关闭.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/TCP连接的建立和关闭.png -------------------------------------------------------------------------------- /pics/UDP头部.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/UDP头部.png -------------------------------------------------------------------------------- /pics/cookie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/cookie.png -------------------------------------------------------------------------------- /pics/代理服务器.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/代理服务器.png -------------------------------------------------------------------------------- /pics/以太网因特网接入.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/以太网因特网接入.png -------------------------------------------------------------------------------- /pics/分组交换.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/分组交换.png -------------------------------------------------------------------------------- /pics/协议栈.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/协议栈.png -------------------------------------------------------------------------------- /pics/各种DNS服务器交互.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/各种DNS服务器交互.png -------------------------------------------------------------------------------- /pics/响应报文.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/响应报文.png -------------------------------------------------------------------------------- /pics/存储转发传输.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/存储转发传输.png -------------------------------------------------------------------------------- /pics/平均排队时延与流量强度的关系.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/平均排队时延与流量强度的关系.png -------------------------------------------------------------------------------- /pics/应用层协议.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/应用层协议.png -------------------------------------------------------------------------------- /pics/接收窗口.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/接收窗口.png -------------------------------------------------------------------------------- /pics/数据传输.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/数据传输.png -------------------------------------------------------------------------------- /pics/文件从服务器到客户的吞吐量.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/文件从服务器到客户的吞吐量.png -------------------------------------------------------------------------------- /pics/混合光纤同轴接入.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/混合光纤同轴接入.png -------------------------------------------------------------------------------- /pics/滑动窗口.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/滑动窗口.png -------------------------------------------------------------------------------- /pics/电路交换.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/电路交换.png -------------------------------------------------------------------------------- /pics/电路交换网络中的复用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/电路交换网络中的复用.png -------------------------------------------------------------------------------- /pics/节点时延.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/节点时延.png -------------------------------------------------------------------------------- /pics/请求报文.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/请求报文.png -------------------------------------------------------------------------------- /pics/请求接收HTML.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/pics/请求接收HTML.png -------------------------------------------------------------------------------- /python_socket/GettingStarted.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/python_socket/GettingStarted.pdf -------------------------------------------------------------------------------- /python_socket/Socket1_WebServer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/python_socket/Socket1_WebServer.pdf -------------------------------------------------------------------------------- /python_socket/Socket2_UDPpinger.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/python_socket/Socket2_UDPpinger.pdf -------------------------------------------------------------------------------- /python_socket/Socket3_SMTP.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/python_socket/Socket3_SMTP.pdf -------------------------------------------------------------------------------- /python_socket/Socket4_ProxyServer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/python_socket/Socket4_ProxyServer.pdf -------------------------------------------------------------------------------- /python_socket/Socket5_ICMPpinger(chap4).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/python_socket/Socket5_ICMPpinger(chap4).pdf -------------------------------------------------------------------------------- /python_socket/Socket6_VideoStreaming(chap7).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/python_socket/Socket6_VideoStreaming(chap7).pdf -------------------------------------------------------------------------------- /python_socket/Traceroute (Chapter 4) .pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/python_socket/Traceroute (Chapter 4) .pdf -------------------------------------------------------------------------------- /slides/Chapter_1_V7.01.ppt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/slides/Chapter_1_V7.01.ppt -------------------------------------------------------------------------------- /slides/Chapter_2_V7.01.ppt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/slides/Chapter_2_V7.01.ppt -------------------------------------------------------------------------------- /slides/Chapter_3_V7.01.ppt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/slides/Chapter_3_V7.01.ppt -------------------------------------------------------------------------------- /slides/Chapter_4_V7.01.ppt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/slides/Chapter_4_V7.01.ppt -------------------------------------------------------------------------------- /slides/Chapter_5_V7.01.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/slides/Chapter_5_V7.01.pptx -------------------------------------------------------------------------------- /slides/Chapter_6_V7.01.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/slides/Chapter_6_V7.01.pptx -------------------------------------------------------------------------------- /slides/Chapter_7_V7.0.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/slides/Chapter_7_V7.0.pptx -------------------------------------------------------------------------------- /slides/Chapter_8_V7.0.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/slides/Chapter_8_V7.0.pptx -------------------------------------------------------------------------------- /slides/Chapter_9_V7.0.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngtrio/Computer-Networking/e3d4edeb7f66e0525c54b59463f4b8937c526d54/slides/Chapter_9_V7.0.pptx --------------------------------------------------------------------------------