---
title: network_questions
date: 2017-01-13 18:27:24
tags: network
---
### 1.概述 ###
定义:计算机网络是用通信设备和线路将分散在不同地点的有独立功能的多个计算机系统互相连接起来,并按照网络协议进行数据通信,实现资源共享的计算机集合。
协议:控制网络中信息接收和发送的一组软件。定义了通信实体之间发送、接收报文的格式和传输顺序,以及收到报文所采取的动作。
#### 因特网服务类型 ####
- 面向连接服务(connection-oriented service)
- 可靠的数据传送
- 流控制
- 拥塞控制
- 无连接服务(connectionless service)
- 不可靠:源主机不能确定分组是否已经到达目的地。
- 无流控制或拥塞控制的功能。
#### 数据如何通过网络传送? ####
- 电路交换
- 分组交换
以下分别详细介绍
电路交换:通信双方必须先建立一个专用的连接(电路),一直维持,直到通信结束。
- 多路复用:在一条传输链路上同时建立多条连接,分别传输数据。
- 频分多路复用FDM(frequency-division multiplexing)
- 时分多路复用TDM (time-division multiplexing)
! [](http://i.imgur.com/47uik6p.png)
分组交换:源端将报文划分为较小的数据块(分组packet);
每个分组通过一系列链路和分组交换机传送,直到目的端
目的端恢复原报文。
#### 因特网协议栈 ####
- 应用层:报文
- 提供各种网络应用。传输应用报文。
- FTP、 SMTP、 HTTP
- 运输层:报文段
- 在应用程序的客户机和服务器之间提供传输应用层报文服务。传输报文段。
- TCP、 UDP
- 网络层:数据报
- 主机和主机之间传输网络层分组(数据报)
- IP协议、 选路协议
- 链路层:帧
- 在邻近单元之间传输数据(帧 )
- PPP、以太网
- 物理层:比特
- 在节点之间传输比特流
- 传输媒体
### 2.应用层 ###
主要掌握应用层协议http,socket api
#### http ####
请求报文
! [](http://i.imgur.com/QJ8LrJA.png)
响应报文:
```
HTTP/1.1 200 OK
Connection close
Date: Thu, 06 Aug 1998 12:00:15 GMT
服务器: Apache/1.3.0 (Unix)
Last-Modified: Mon, 22 Jun 1998 …...
Content-Length: 6821
Content-Type: text/html
data data data data data ...
```
响应状态码:
- 200 OK
请求成功,请求的对象在这个报文后面
- 301 Moved Permanently
请求的对象已转移,新的URL在响应报文的Location:首部行中指定
- 400 Bad Request
请求报文不为服务器理解
- 404 Not Found
请求的文档没有在该服务器上发现
- 505 HTTP Version Not Supported
#### socket ####
client
```java
import java.io.*;
import java.net.*;
class TCP Client {
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
Socket ClientSocket = new Socket("hostname", 6789);
DataOutputStream outToServer =
new DataOutputStream(ClientSocket.getOutputStream());
BufferedReader inFromServer =
new BufferedReader(new
InputStreamReader(ClientSocket.getInputStream()));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("FROM Server: " + modifiedSentence);
ClientSocket.close();
}
}
```
server
```java
import java.io.*;
import java.net.*;
class TCP Server {
public static void main(String argv[]) throws Exception
{
String ClientSentence;
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient =
new BufferedReader(new
InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
ClientSentence = inFromClient.readLine();
capitalizedSentence = ClientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
}
}
}
```
### 3.传输层 ###
在运行不同主机上应用进程之间提供逻辑通信
传输协议运行在端系统中
发送方:将应用报文划分为段,传向网络层
接收方:将段重新装配为报文,传向应用层
应用可供使用的传输协议不止一个
因特网:TCP和UDP
#### udp ####
为何要有 UDP协议?
无连接创建(它将增加时延)
简单:在发送方、接收方无连接状态
段首部小
无拥塞控制: UDP能够尽可能快地传输。
! [](http://i.imgur.com/gimo6BT.png)
#### tcp ####
! [](http://i.imgur.com/x11ygPT.png)
序号:
报文段中第1个数据字节在字节流中的位置编号
确认号:
期望从对方收到下一个字节的序号
累计应答
**三次握手:**
- 步骤 1: 客户机向服务器发送 TCP SYN报文段
- 指定初始序号
- 没有数据
- 步骤 2: 服务器收到SYN报文段, 用SYNACK报文段回复
- 服务器为该连接分配缓冲区和变量
- 指定服务器初始序号
- 步骤 3: 客户机接收到 SYNACK, 用ACK报文段回复,可能包含数据
- 步骤 1: 客户机向服务器发送TCP FIN控制报文段
- 步骤 2: 服务器收到FIN,用ACK回答。关闭连接,发送FIN
- 步骤 3: 客户机收到FIN, 用ACK回答
- 步骤 4: 服务器接收ACK,连接关闭
### 4.网络层 ###
主要理解ip协议和选路算法
! [](http://i.imgur.com/YN5rb81.png)
NAT: 网络地址转换
! [](http://i.imgur.com/t72xjCr.png)
### 4.链路层 ###
帧, 链路访问:
将数据报封装进帧,加上首部和尾部
如果共享媒体,信道访问
位于帧首部的“MAC”地址标识源、目的地
ARP: 地址解析协议
LAN上的每个IP节点(主机、路由器)都有ARP表
ARP表: 对美协LAN节点的IP/MAC地址映射
< IP地址; MAC地址; TTL>
title: network_questions
date: 2017-01-13 18:27:24
tags: network
---
### 1.概述 ###
定义:计算机网络是用通信设备和线路将分散在不同地点的有独立功能的多个计算机系统互相连接起来,并按照网络协议进行数据通信,实现资源共享的计算机集合。
协议:控制网络中信息接收和发送的一组软件。定义了通信实体之间发送、接收报文的格式和传输顺序,以及收到报文所采取的动作。
#### 因特网服务类型 ####
- 面向连接服务(connection-oriented service)
- 可靠的数据传送
- 流控制
- 拥塞控制
- 无连接服务(connectionless service)
- 不可靠:源主机不能确定分组是否已经到达目的地。
- 无流控制或拥塞控制的功能。
#### 数据如何通过网络传送? ####
- 电路交换
- 分组交换
以下分别详细介绍
电路交换:通信双方必须先建立一个专用的连接(电路),一直维持,直到通信结束。
- 多路复用:在一条传输链路上同时建立多条连接,分别传输数据。
- 频分多路复用FDM(frequency-division multiplexing)
- 时分多路复用TDM (time-division multiplexing)
! [](http://i.imgur.com/47uik6p.png)
分组交换:源端将报文划分为较小的数据块(分组packet);
每个分组通过一系列链路和分组交换机传送,直到目的端
目的端恢复原报文。
#### 因特网协议栈 ####
- 应用层:报文
- 提供各种网络应用。传输应用报文。
- FTP、 SMTP、 HTTP
- 运输层:报文段
- 在应用程序的客户机和服务器之间提供传输应用层报文服务。传输报文段。
- TCP、 UDP
- 网络层:数据报
- 主机和主机之间传输网络层分组(数据报)
- IP协议、 选路协议
- 链路层:帧
- 在邻近单元之间传输数据(帧 )
- PPP、以太网
- 物理层:比特
- 在节点之间传输比特流
- 传输媒体
### 2.应用层 ###
主要掌握应用层协议http,socket api
#### http ####
请求报文
! [](http://i.imgur.com/QJ8LrJA.png)
响应报文:
```
HTTP/1.1 200 OK
Connection close
Date: Thu, 06 Aug 1998 12:00:15 GMT
服务器: Apache/1.3.0 (Unix)
Last-Modified: Mon, 22 Jun 1998 …...
Content-Length: 6821
Content-Type: text/html
data data data data data ...
```
响应状态码:
- 200 OK
请求成功,请求的对象在这个报文后面
- 301 Moved Permanently
请求的对象已转移,新的URL在响应报文的Location:首部行中指定
- 400 Bad Request
请求报文不为服务器理解
- 404 Not Found
请求的文档没有在该服务器上发现
- 505 HTTP Version Not Supported
#### socket ####
client
```java
import java.io.*;
import java.net.*;
class TCP Client {
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
Socket ClientSocket = new Socket("hostname", 6789);
DataOutputStream outToServer =
new DataOutputStream(ClientSocket.getOutputStream());
BufferedReader inFromServer =
new BufferedReader(new
InputStreamReader(ClientSocket.getInputStream()));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("FROM Server: " + modifiedSentence);
ClientSocket.close();
}
}
```
server
```java
import java.io.*;
import java.net.*;
class TCP Server {
public static void main(String argv[]) throws Exception
{
String ClientSentence;
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient =
new BufferedReader(new
InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
ClientSentence = inFromClient.readLine();
capitalizedSentence = ClientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
}
}
}
```
### 3.传输层 ###
在运行不同主机上应用进程之间提供逻辑通信
传输协议运行在端系统中
发送方:将应用报文划分为段,传向网络层
接收方:将段重新装配为报文,传向应用层
应用可供使用的传输协议不止一个
因特网:TCP和UDP
#### udp ####
为何要有 UDP协议?
无连接创建(它将增加时延)
简单:在发送方、接收方无连接状态
段首部小
无拥塞控制: UDP能够尽可能快地传输。
! [](http://i.imgur.com/gimo6BT.png)
#### tcp ####
! [](http://i.imgur.com/x11ygPT.png)
序号:
报文段中第1个数据字节在字节流中的位置编号
确认号:
期望从对方收到下一个字节的序号
累计应答
**三次握手:**
- 步骤 1: 客户机向服务器发送 TCP SYN报文段
- 指定初始序号
- 没有数据
- 步骤 2: 服务器收到SYN报文段, 用SYNACK报文段回复
- 服务器为该连接分配缓冲区和变量
- 指定服务器初始序号
- 步骤 3: 客户机接收到 SYNACK, 用ACK报文段回复,可能包含数据
- 步骤 1: 客户机向服务器发送TCP FIN控制报文段
- 步骤 2: 服务器收到FIN,用ACK回答。关闭连接,发送FIN
- 步骤 3: 客户机收到FIN, 用ACK回答
- 步骤 4: 服务器接收ACK,连接关闭
### 4.网络层 ###
主要理解ip协议和选路算法
! [](http://i.imgur.com/YN5rb81.png)
NAT: 网络地址转换
! [](http://i.imgur.com/t72xjCr.png)
### 4.链路层 ###
帧, 链路访问:
将数据报封装进帧,加上首部和尾部
如果共享媒体,信道访问
位于帧首部的“MAC”地址标识源、目的地
ARP: 地址解析协议
LAN上的每个IP节点(主机、路由器)都有ARP表
ARP表: 对美协LAN节点的IP/MAC地址映射
< IP地址; MAC地址; TTL>