《计算机网络-自顶向下方法》读书笔记-传输层篇
标签: 网络 读书笔记 校招 面试
概述和传输层服务
传输层协议为运行在不同Host上的进程提供了一种逻辑通信机制
端系统运行传输层协议
- 发送方 : 将应用递交的消息分成一个或多个Segment,并向下穿给网络层
- 接收方 : 将接收到的segment组装成消息,并向上交给应用层
.
传输层可以为应用提供的协议主要有TCP和UDP
传输层VS网络层
网络层: 提供主机之间的逻辑通信
传输层: 提供进程之间的逻辑通信
- 位于网络层之上
- 依赖网络层服务
- 对网络层服务进行(可能的)增强
可靠、按序的交付服务(TCP)
- 拥塞控制
- 流量控制
- 连接建立
不可靠的交付服务(UDP)
- 基于”尽力而为(Best-effort)”的网络层,没有(可靠性方面的)扩展
两种服务均不保证
- 延迟
- 带宽
多路复用与多路分解
接收端进行多路分组:传输层依据头部信息将收到的Segment交付给正确的Socket,即正确的进程.
发送端进行多路复用:从多个Socket接收数据,为每块数据封装上头部信息,生成Segment,交给网络层.
分用如何工作
主机接收到IP数据报(datagram)
- 每个数据报携带源IP地址、目的IP地址
- 每个数据报携带一个传输层的段(Segment)
- 每个段携带源端口号和目的端口号
主机收到Segment之后,传输层协议提取IP地址和端口号信息,将Segment导向相应的Socket.
- TCP做更多处理
无连接分用
主机收到UDP之后,检查目的端口号然后把数据导向相应Socket.
不同源IP地址和源端口号的IP数据包被导向同一个Socket
UDP的Socket用二元组标识:
- (目的IP地址,目的端口号)
Java中使用UDP的方式说明只关心监听的端口,而不管数据从何而来
DatagramSocket socket = new DatagramSocket(servPort);
DatagramPacket packet = new DatagramPacket(new byte[ECHOMAX], ECHOMAX);
while(true){
socket.receive(packet);
System.out.println("Handling client at " + packet.getAddress().getHostAddress()
+ " on port" + packet.getPort());
socket.send(packet);
packet.setLength(ECHOMAX);
}
面向连接的分用
TCP的Socket用四元组标识:
- 源IP地址
- 源端口号
- 目的IP地址
- 目的端口号
服务器可能同时支持多个TCP
接收端利用所有的四个值将Segment导向合适的Socket
Web服务器为每个客户端开不同的 Socket
ServerSocket servSock = new ServerSocket(servPort);
while(true){
//可以看出每次有新连接进来,accept方法都会返回一个新的Socket对象
Socket clntSock = servSock.accept();
SocketAddress clientAddress =
clntSock.getRemoteSocketAddress();
System.out.println("Handling client at " + clientAddress);
InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();
while((recvMsgSize = in.read(receiveBuf)) != -1) {
out.write(receiveBuf,