美文网首页学习
关于TCP,UDP,HTTP,HTTPS,SOCKET的学习笔记

关于TCP,UDP,HTTP,HTTPS,SOCKET的学习笔记

作者: 卡优优 | 来源:发表于2016-04-19 18:52 被阅读565次

1:物理层:其实就是转换一些电子信号为0和1组成的比特流的形式;没有物理层比特流就无法在物理介质中传输;

2:数据链路层:它定义了通过通信介质链接的设备之间进行数据传输的规范;数据链路层数据不在以0和1的形式存在了,而是被分割成帧的概念;

它有两个重要的概念:

a:MAC地址:它是被烧录到网卡中的48比特的一串数字,在世界范围内是唯一的,它用来区分节点,一旦指定了Mac地址就不会不知道往哪个设备传输的情况。

b:分组交换:就是将数据较大的分成若干小的的数据,然后依次发送。这样做的原因是不同的数据链数层有不同的MTU最大的传输单元。

拓展:交换机这一设备就是出现在数据链路层,它有不同的端口,可以连接不同的设备;它根据每个针中的Mac地址来决定给哪个端口发数据,要参照转发表。

强调的是:数据链路层的定义:它是定义了同一种通信介质两端的节点进行数据传输的规范;它存在的意义就是如果没有数据链路层,那数据只能以数据流的形式存在于通信介质中,而不知道该往哪发送,过长的数据流可能无法发送。

3:网络层 :它对应的是IP协议,它主要的作用是实现终端节点的通信;当然网络层中还有ARP(获取MAC地址)和ICMP协议(数据发送异常通知)等等

数据链路层是实现在同一种数据链路下的包传递,而网络层则是实现不同的数据链路层的包传递:wifi 以太网就是不同的数据链路;

它有三大的模块:1:IP寻址,2:路由 3:IP分包

IP寻址:一种适用于网络层的通讯对端信息的地址;举例:下班回家,公司和家就是两个对端,我需要转3,8号地铁它们就是数据链路层,地铁转线的节点就是MAC地址;

IP地址有32位正整数构成,外在形式分为四个部分;功能上分为两大部分:网络标识和主机标识;

路由:将分组的数据发送到目标地址的功能,路由控制器中保存着一张表,可以在表中查找下一个路由器的地址;

分包重组:数据链数层有最大的MTU,那IP协议也有分片和重组,分片有发送端主机和路由器负责,重组则有接收端负责,由于分片会加重路由器的负担,所以主机就获取整个路径中的所有的数据链路的最小MTU,那传输过程中每一个路由器都不会再分片操作了;

IP的拓展:

DNS解析:由于通信双方的IP地址是一串的数字,不方便记忆,所以就诞生了域名帮助我们记忆。域名是一种为了识别主机名称和机构名的具有分层的名称,比如在域名 neu.edu.cn中,neu是主机名,edu 和 cn 是不同层次下的机构名。域名和IP地址都可以唯一对应一台主机,DNS协议就是转换IP地址为容易识别记忆的域名。

ARP协议:获取Mac地址的协议:MAC 和 IP 地址虽然看上去功能类似(都是用于唯一区分主机),但是两者缺一不可。如果只有 IP 地址,虽然可以跳过 ARP,直接在数据链路上发一个广播,但是这仅适用于通信双方处于同一个数据链路下的情况。如果双方处于不同的数据链路,数据报无法穿透中间的路由器。(借鉴别人的话)

NAT NAPT一种将局域网的私有地址转换成全局的IP地址的技术

它为了解决不同网段内同一个IP地址时怎么通信的问题。

4:传输层:TCP UDP协议

TCP:它是面向有连接的协议,也就是说使用TCP协议是发送方和接收方必须建立连接,一般情况下三次建立连接,四次断开连接;

建立连接后由于TCP有数据重传和流量控制等功能,TCP能够正确的处理丢包的问题保证接收方能收到数据,但是他的规范比较多,效率不及UDP,所以实时的视频音频传输不太适合;

UDP:面向无连接的协议,它只管发送数据而不管对方接受与否,这种特性反而适合多播,视频播放,及时个别的丢包也不会影响整体的效果;

传输层主要是实现应用程序之间的通信,所以传输层新增了三个要素:目标端口,源端口,协议号,加上IP协议两大关键的要素:源IP地址,目标IP地址,这五个要素能识别一个通信;

协议号则是区分 TCP UDP的;

TCP:三次的握手;为什么三次呢????

资料说要时刻记住网络是不稳定的,数据包是可能丢失的,假设没有第三次确认,客户端向服务端发送了 SYN,请求建立连接。由于延迟,服务端没有及时收到这个包。于是客户端重新发送一个 SYN 包。回忆一下介绍 TCP 首部时提到的序列号,这两个包的序列号显然是相同的。

假设服务端接收到了第二个 SYN 包,建立了通信,一段时间后通信结束,连接被关闭。这时候最初被发送的 SYN 包刚刚抵达服务端,服务端又会发送一次 ACK 确认。由于两次握手就建立了连接,此时的服务端就会建立一个新的连接,然而客户端觉得自己并没有请求建立连接,所以就不会向服务端发送数据。从而导致服务端建立了一个空的连接,白白浪费资源。三次握手情况下客户端会收到一个重复的ack,它会抛弃它不会建立连接。不进行第三次的握手。

三次握手其实解决的是第二次握手数据包丢失的问题,如果第三步的确认包丢失了怎么办呢?

TCP处理丢包的一般办法是服务端会重传数据包给客户端,直到收到ACK为止,这种做法会导致SYN的泛红攻击,比如多个伪造的IP地址在服务端返回ACK确认后故意不发ACK过去,从而使得服务器不断的重发ACK,导致服务器处于半连接的状态,最后消耗过多的CPU和内存资源导致死机;

正确的处理做法其实是服务端发送RST报文,进入close的状态,这表示连接的信息被初始化,原有的TCP的通道不能继续的进行,如果客户端想重新建立连接必须从第一步开始;

四次挥手的最后一步确认关闭丢失怎办呢???

实际上呢客户端在第三步收到FIN包呢会设置一个计时器,等待一段相当长的时间,如果客户端的ACK包丢失,服务端会重发FIN并重设计时器,假设在计时器失效前FIN包都没有到达客户端,那客户端就进入了close的状态,那从而导致服务端永远也无法收到ACK确认也就无法关闭了。

其实TCP区别于UDP最大的就是前者有数据丢包重发和流量控制;

TCP窗口的概念:

按照之前的理论,在数据包发出后,直至 ACK 确认返回以前,发送端都无法发送数据,而且包的往返时间越长,网络利用效率和通信性能就越低。前两张图片形象的解释了这一点。

为了解决这个问题,TCP 使用了“窗口”这个概念。窗口具有大小,它表示无需等待确认应答就可以继续发送数据包的最大数量。引入窗口概念后,数据要缓存一下不能立即的丢弃以备重发;

如果出现丢包那就是TCP最擅长处理的问题了,比如窗口为4 ACK 收到1001 4001那我们完全的可以相信中间的两个也成功的接收了,不然ACK不会相加,如果没有窗口那就需要重传中间的两个包了,也就是那空间换时间。

流量控制:也就是设置窗口中的大小,如果窗口过大那会导致瘫痪,那程序会在启动的时候通过慢启动的算法算出窗口大小,对发送数据进行流量的控制。

HTTP:最顶层的应用层协议,浏览器访问网页就是直接使用了HTTP,使用HTTP协议时客户端需要先跟服务端的80端口建立tcp连接,然后在这个连接的基础上进行请求和应答以及数据的交换。

http分1.0 1.1的版本,前者呢需要每次请求和应答都要建立TCP的连接,后者不需要;

由html协议加载出来的网页,通常是有html的语言来描述的,它是一段纯文本,它算是表现层了;

Get Post请求:

GET 请求通常用于查询、获取数据,而 POST 请求则用于发送数据,除了用途上的区别,它们还有以下这些不同:

GET 请求可以被缓存,可以被收藏为书签,但 POST 不行。

GET 请求会保留在浏览器的历史记录中,POST 不会。

GET 请求的长度有限制(不同的浏览器不一样,大约在几 Kb 左右),URL 的数据类型只能是 ASCII 字符,POST 请求没有限制。

GET 请求的参数在 URL 中,因此绝不能用 GET 请求传输敏感数据。POST 请求数据则写在 HTTP 的请求头中,安全性略高于 GET 请求。

HTTP是一种无状态的连接。客户端每次读取web的信息都会被认为是一个新的会话;但是有时我们需要长久的保存一些信息,这些就有cookie session来做了;

cookie保存在客户端,session呢保存在服务端

HTTPS则相对HTTP是安全的,它充分利用了对称和非对称的加密。

socket:它不是协议,它是TCP/IP协议中的应用层和传输层之间的抽象,是它们的一个封装,是一个调用的API,通过socket我们可以使用TCP .IP。系统提供的一种网络通信的办法;

socket描述了一个端口port对,一个IP对,它简化了程序员的操作指导对方的IP,端口,就可以给对方发消息,所以socket一定是包含了双方 客户端和服务端。

Socket原理

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

Socket连接

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。

套接字之间的连接过程分为三个步骤:

服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求

客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求

连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求

参考文章:

原文链接:http://www.jianshu.com/p/06f8b9111a56

原文链接:http://www.jianshu.com/p/dc456cf57e06

相关文章

网友评论

    本文标题:关于TCP,UDP,HTTP,HTTPS,SOCKET的学习笔记

    本文链接:https://www.haomeiwen.com/subject/eqczlttx.html