计算机网络知识
OSI和TCP/IP各层的结构和功能
OSI体系协议
应用层
表示层
会话层
运输层
网络层
数据链路层
物理层
TCP/IP协议体系
应用层
运输层
网际层
网络接口层
五层协议体系
应用层
运输层
网络层
数据链路层
物理层
各层的作用
应用层
- 通过应用进程间的交互来完成特定的网络应用
- 应用层的协议定义的是应用进程间的通信和交互的规则
- 对于不同的网络应用需要使用不同的应用层协议
- 常用的应用层协议有:DNS(域名系统)HTTP(超文本传输协议) 支持电子邮件的SMTP协议
- 应用层交互的数据单元称为报文。
DNS
- 域名系统(Domain Name System) 是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
HTTP
- 超文本传输协议,是互联网上应用最为广泛的一种网络协议,所有的万维网文件都必须遵守这个标准,设计HTTP最初是为了提供一种发布和接收HTML页面的方法。
运输层
- 主要作用是负责两台主机进程之间的通信,提供通用的数据传输服务。
- 运输层主要使用以下两种协议:
- 传输控制协议 TCP(Transmission Control Protocol)提供面向连接的,可靠的数据传输服务
- 用户数据协议 UDP(User Datagram Protocol)提供无连接的,尽最大努力的数据传输服务,不保证数据可靠性
UDP
- UDP是无连接的
- UDP使用尽最大努力交付,不保证可靠交付,因此主机不需要维持复杂的链接状态
- UDP是面向报文的
- UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低,所以对实时传输应用很有用,如 直播,实时视频会议等
- UDP支持一对一、一对多、多对一和多对多的交互通信
- UDP的首部开销小,只有8个字节,比TCP的20个字节首部要短
TCP
- TCP是面向连接的,传输数据之前要先建立连接,传输结束之后,要释放连接。
- 每一条TCP连接只能由两个端点,每一条TCP连接只能是点对点的,一对一的
- TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达。
- TCP面向字节流。流是指流入进程或从进程流出的字节序列。面向字节流的含义是: 虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
- TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。
网络层
- 主要负责为分组交换网上的不同主机提供通信服务,并且选择合适的路由,使源主机运输层所传下来的分组,能通过网络层中的路由器找到目的主机。
- 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报,简称 数据报。
数据链路层
- 两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层协议。在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装成帧,在两个相邻界节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)
- 在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。 控制信息还使接收端能够检测到所收到的帧中有误差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
物理层
- 物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。
TCP协议如何保证可靠传输
- 应用数据被分割成TCP认为最适合发送的数据块
- TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 校验和: TCP将保持它首部和数据的校验和。
- TCP的接收daunting会丢弃重复的数据
- 流量控制
- 拥塞控制
- 停止等待协议
- 超时重传
打开一个网页,整个过程会使用哪些协议
- DNS:获取域名对应的IP地址
- TCP:与服务器建立TCP连接
- IP:建立TCP连接时,需要使用网络层的IP协议发送数据
- OPSF:IP数据包在路由之间,路由选择时使用OPSF协议
- ARP:地址解析协议,路由器在与服务器通信时,需要将IP地址转换成MAC地址,需要使用ARP协议
- HTTP:在TCP建立连接完成后,使用HTTP协议访问网页
状态码
状态码 | 类别 | 原因短语 |
---|---|---|
1XX | 信息性状态码 | 接收的请求正在处理 |
2xx | 成功状态码 | 请求正在处理完毕 |
3xx | 重定向状态码 | 需要进行附加操作以完成请求 |
4xx | 客户端错误状态码 | 服务器无法处理请求 |
5xx | 服务器错误状态码 | 服务器处理请求出错 |
HTTP长连接和短连接
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次连接,任务结束就中断连接。当客户端浏览器访问的某个html或其他类型的web页中包含有其他的web资源(如js、图像、css等),没遇见这样一个web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应投加入这行代码:Connection:keep-alive
在使用长连接时,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
TCP的三次握手过程中,accept发生在三次握手的哪个阶段?
发生在三次握手之后,分析一下“三次握手”的过程:
1、服务端处于LISTEN状态,客户端处于CLOSED状态;
2、客户端打开,并进行SYN的发送,处于SYN_SENT状态;
3、服务端收到此条消息后,转为SYN_RCVD状态,并对客户端进行消息回复;
4、客户端收到此条消息后,转为ESTABLISHED状态,并发送一个ACK的确认消息。
5、服务端收到此条消息后,转为ESTABLISHED状态。
至此,三次握手完成。
然而,聪明的你,通过上面的分析,你可能会得到这样的结论:accept()发生在第3步,原因是,此时accept()函数需要给此次连接分配资源。的确,最初是想这样设计的。但是,设想一个情景,若有10000个客户端都和该服务端进行连接,发送SYN,服务端收到之后,这些客户端却不再理会服务端的回复,然而此时服务端的资源却都用accept()分配了。这就是所谓的“DDOS攻击”。
为了解决这个问题,accept()于是被放在三次握手之后。
当然,这样也不能保证不能被攻击,当然这是后话