赞
踩
《网络是怎样连接的》读书笔记
浏览器是一个具备多种客户端功能的综合性客户端软件,因此它需要不同的URL判断应该使用其中哪种功能来访问相应的数据:http、ftp。
HTTP协议定义了客户端和服务器之间交互的消息内容和步骤,客户端请求消息包含两部分:对什么?(URL)、进行怎样的操作?(方法)。服务端回应的响应消息:状态码+头字段+网页数据。协议格式:
状态码:1xx:告知请求的处理进度、情况。2xx:成功。3xx:需要进一步操作。4xx:客服端错误。5xx:服务端错误。
1条请求消息中只能写1个URI。如果需要获取多个文件(如图片),必须对每个文件单独发送1条请求。
网络设备的地址:网络号+主机号:10.11.12.13/255.255.255.0 = 10.11.12.13/24。子网掩码确定内部结构。
浏览器使用Socket库(OS提供,用于调用网络功能)中的解析器(它又委托OS内部的协议栈(TCP/IP驱动))根据域名查询IP。
weread.qq.com 查询过程:客户端首先会访问最近的一台DNS服务器(客户端的TCP/IP设置中填写的DNS服务器IP),若无,则从顶层往下查找,根域DNS服务器有没有? -> com有没有? -> qq有没有? -> weread(目标DNS)。
实际上DNS有缓存
功能,可记住查过的域名,直接返回信息,不需要一级级查。
socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。在Unix一切皆文件哲学的思想下,socket是一种
打开—读/写—关闭
模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
使用Socket库收发数据:
描述符:应用程序用来识别套接字(可能同时建立多个)的机制。IP地址和端口号:客户端和服务器之间用来识别对方套接字的机制。
存放控制信息(通信对象的IP地址、端口号、通信操作的进行状态)的内存空间就是套接字的实体。协议栈根据套接字中记录的控制信息来工作。netstat命令显示套接字内容,一行相当于一个套接字(也可以说客户端服务端各一个):
>netstat -ano
协议 本地地址 外部地址 状态 PID
TCP 0.0.0.0:49668 0.0.0.0:0 LISTENING 780
TCP 10.102.230.90:64557 117.184.248.63:443 ESTABLISHED 2356
TCP 10.102.230.90:49451 8.8.4.4:443 SYN_SENT 2356
UDP 0.0.0.0:500 *:* 3580
我们需要把服务器的IP地址和端口号等信息告知协议栈,需要让客户端向服务器告知必要的信息(通信请求)等等,所以连接实际上是通信双方交换控制信息,在套接字中记录这些必要信息(IP,port)并准备数据收发。此外还需要分配一块临时收发数据的缓冲区。
连接实际过程:三报文握手/三次握手(three way handshake)。同步位SYN,确认位ACK。
序号seq:发送方告知接收方,本报文段所发送的数据的第一个字节的序号。
确认号ack:期望收到对方下一个报文段的第一个数据字节的序号。(ack=N,则到seq=N-1的所有数据都已正确收到)
协议栈收到数据,发出时的判断要素:每个网络包能容纳的数据长度(收到的数据长度超过或者接近MSS时再发送。避免发送大量小包,提高网络效率)、时间(协议栈的内部有一个计时器,经某一间隔必须发送。降低网络延迟)。按需权衡两矛盾的要素。
通过序号和确认号可以确认接收方是否收到了网络包。如果对方没有返回某些包对应的确认号,就重传。有了这一机制,我们就不需要在其他地方(数据链路层、物理层)对错误进行补救(检测到错误直接丢弃)了。但要根据网络包平均往返时间调整确认号等待时间(超时重传),以既不造成网络拥塞(大量多余的重传)又不使网速变慢(等待过长,重传延迟)。
发一个包就等一个确认号太浪费时间,所以使用滑动窗口:在发送一个包之后,不等待确认号返回,而是直接发送后续的一系列包。但发送包的频率可能超过接收方处理能力(造成接收缓冲区溢出),所以接收方需要告诉发送方自己最多能接收多少数据(窗口大小)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。