网络基础——浅入深出

现在网上已经有大量的tcp/ip的介绍文章了,但是阿鲤还是要写一篇,一方面是对知识的总结,另一方面希望以不同的视角去看待问题,或许会有同学和我风格一致呢。

一:url是什么?

二:DNS协议

三:三次握手

四:四次挥手

五:tcp协议格式

六:http协议


在百度上搜索c++会发生什么?

我们要搞清楚在百度上送搜索c++之后会发生、那我需要先搞清楚一个东西url;那么url是什么

URL 即Uniform Resource Locator,统一资源定位符,也就是我们常说的网址,接下来给大家解析以下HTTP的格式;

http://username:password@baike.baidu.com/item/HTML/97406?fr=aladdin#ch

http:协议方案名称

username:password:用户名和密码

baike.baidu.com:服务器地址信息(ip地址(域名解析)和port号(默认80))

/item/HTML/97406:资源路径(实体资源(加载网页文件)or某个功能(登陆))

fr=aladdin:查询字符串(提供给服务器的信息,格式为key=val&key=val的型式)

ch:片段标识符,指向html标签

ok,现在大家知道了url,那就让我们看看再百度上输入c++会怎样。

我们再百度上输入c++,就会得到这样一个网址:https://www.baidu.com/s?ie=UTF-8&wd=c++

就如同上面的介绍,https是协议方案(相较于http更安全);

1:通过域名查询ip地址(DNS协议

1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。

2. 如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。但是这种操作系统级别的域名解析规程也被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,造成所谓的域名劫持。所以在windows7中将hosts文件设置成了readonly,防止被恶意篡改。

 

3.  如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。

4. 如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析

5. 根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址

6. 此时LDNS再发送请求给上一步返回的gTLD

7. 接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器

8. Name Server根据映射关系表找到目标ip,返回给LDNS

9. LDNS缓存这个域名和对应的ip

10. LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束

ok,我们现在拿到了服务器的ip地址,我们就可以开始访问了。

在访问之前,我们首先需要和服务器建立链接了;http是应用层协议,其传输层协议是tcp协议,tcp协议的链接是通过三次握手实现的;

请大家根据上图,跟我一起过一下三次握手断点过程

1:客户端向服务端发出syn = 1000请求(假设),并把状态把置为syn_sent;表示客户端已经向服务端发出来syn请求,想和服务端建立链接。

2:服务端收到客户端发送的syn请求之后,向客户端回复一个ack = 1001,并且发出一个syn = 888(假设)的请求,把状态置为syn_rcvd;表示服务端已经收到了syn请求,并且回复了客户端的请求以及向客户端发出了syn请求。

3:客户端收到服务端发送的ack和syn后向服务端回复一个ack=889,把状态置为了established;表示我已经和服务端建立了链接,等到服务端收到客户端的ack回复之后,也会将状态置为establisged,表示已经建立了链接。

这样三次握手的过程就结束了,这个链接也就建立起来了。

那么为什么需要进行三次握手才可以建立起链接呢?而不是两次或四次呢?

答:两次不足够,四次不必要;

为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤
如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认;四次握手是没有必要的,因为服务端在回复客户端的syn请求时,可以将自己的请求一同发出,这样是可以节省时间的。

ok,我们现在知道了tcp是怎样建立链接的,那我们不妨也看看tcp是怎样断开链接的,即四次挥手;                            

                   客户端                                   服务端

1:客户端向服务端发送fin请求,把状态置为Ffin_wait_1;表示我要和服务端断开链接;

2:服务端收到客户端的fin请求,会给客户端回复一个ack,把状态置为close_wait状态;接下来在服务端调用close()或shutdown命令之后,服务端会向客户端发送一个fin包,并且把状态置为last_ack;表示我也要和你断开链接;

3:在客户端收到服务端的ack回复后,会向将自己的状态置为fin_wait_2,表示服务端收到了我的链接断开请求;接着收到服务端的fin包,会将自己的状态置为time_wait状态,并且向服务端回复一个ack;

4:服务端收到ack回复之后,会把状态置为close状态;等客户端的time_wait状态执行结束之后,也会把状态置为close状态。

那么为什么需要进行四次挥手呢?

答:因为四次最可靠,最顺利。

客服端告诉服务端,我的数据发完了(客户端的fin包)。你看看你还有没有数据要发给我,没有的话,我们的通信就可以断了(close_wait的意义,也就是不把ack和fin包一起发送的原因)。

服务端也告诉客户端,我的数据也发完了,我们一起关闭吧(服务端的fin包)。

那么为什么客户端有一个time_wait状态,意义是什么呢?

首先我们要知道,客户端的这个time_wait的时长有2MSL;那么什么是MSL是什么?

MSL:MSL(Maximum Segment Lifetime)报文最大生存时间,网络中的报文存在时长,超过这个时间就会被丢弃。一个MSL的时长是可以设置的,一般为30秒,1分钟,2分钟。

为啥是两个msl时间的,这是为了防止客户端给服务端的ack回复丢失(1个msl时长),导致服务端重新发送fin请求(2个msl时长);

现在我们看一下连接建立,数据交互,链接断开的图;

ok,我们现在知道了什么是三次握手,和四次挥手,但是我们依旧有些云里雾里,因为我们并不知道tcp协议的格式是怎样的。那么接下来,我们就一起看看tcp协议格式

这个图,就是tcp协议格式了

1、端口号:用来标识同一台计算机的不同的应用进程。

        1)源端口:源端口和IP地址的作用是标识报文的返回地址。

        2)目的端口:端口指明接收方计算机上的应用程序接口。

TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

2、序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号;确认号一般是序号+数据的大小。也就是上图中的seq和ack了。

3、首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。

4、保留:为将来定义新的用途保留,现在一般置0。

5、控制位:URG  ACK  PSH  RST  SYN  FIN,共6个,每一个标志位表示一个控制功能。

1)URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。

2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。

3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。

4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。

5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。

6)FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

6、窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。

7、校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。

8、紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

9、选项:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。

10、数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

ok,我们知道了tcp的格式,那么tcp是怎样保证可靠传输呢?

1:可靠传输:通过三次握手,四次挥手保证了通信双方具有数据收发的能力。

2:确认应答机制:接收方对于每一条数据都要进行确认回复,告诉发送方数据收到了。

3:超时重传机制:发送方发送数据后一段时间内没有收到确认回复,则对数据进行重传(超时重传的等待是动态的,会随着网络的变化而变化;若连续多条数据没有被收到,就会调整超时时间)。

4:包序管理:协议中的序号,确认序号进行了包序管理,保证数据有序交付。

5:校验和:校验数据的一致性,不一致就会要求重传

6:滑动窗口:控制了数据收发的速率,避免每次发送速度过快,造成的数据丢失

7:拥塞机制:避免发送数据过多而网络不好造成的数据大量丢包,通过发送方维护一个发送窗口,限制当前能够发送的最大数据大小(使用网络探测实现)

tcp有这么多性质,那么它是怎样保证数据传输的效率你?

1:快速重传:数据丢失后快速对丢失的数据进行重传,(接收方认为数据丢失后,会连续向发送端发送三次丢失数据的重传请求)

2:捎带应答机制:将确认回复于即将发送的数据结合,一起发送

3:延迟应答机制:接收方接收到一条数据,并不立即进行确认回复,会造成窗口变小,影响吞吐量;因此延迟一会进行应答,这个延迟期间有可能数据被recv出去,窗口不变,保证吞吐率。

ok我们现在详细的把tcp协议过了一遍,那我们现在回头看看我们的请求;在链接建立之后,http协议就要向服务端发送请求了。

http协议链接_

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值