TCP连接、HTTP学习笔记

HTTP

它是一种超文本传输协议,那么什么是超文本,互联网早期我们保存的信息通常是以文本的形式存在,文本是一种能够被计算机解析的有意义的二进制数据包。但是如今的不仅仅局限于只传输文本,还有音频、图片等。超文本也就是超级文本的缩写,它是具有超链接功能的文本。什么是传输,即依据网络传输协议来进通信的过程。什么是协议,网络协议就是计算机网络中进行数据交换而建立的规则标准的集合

文本、富文本、超文本的区别?

1.即只有文字且无颜色、插画等,并且文本只能按照顺序读,例如记事本

2.富文本具有文本的特征,并且可以插入图片、改变字体大小颜色等功能,例如word

3.超文本具有富文本的特征,并且可以根据超链接进行跳转,即HTML网页,我们在浏览器上看到的内容就是浏览器解析超文本(HTML代码)后的输出结果

HTTP1.0特点

无连接,即限制每次连接只处理一个请求,可以节省不少传输时间,如今大多数服务器支持Connection:Keep-Alive功能,如今服务器支持长连接解决无连接的问题。

无状态,是指协议对于事务处理没有记忆能力,客户端发送请求后,服务器根据请求作出应答发送数据,断开连接后不会记录信息,如今使用Cookie机制保持session解决无状态问题

HTTP1.1特点

只要客户端服务端任意一端没有明确提出断开TCP连接,就会一直保持连接,期间可以发送多次HTTP请求。

管线化。客户端可以同时发出多个请求,不用一个个等响应

断点续传。服务器可以将数据进行分段传输,客户端慢慢显示

在上述HTTP1.0特点中,那么什么是Cookie和Session? 

Cookie和Session都是用来跟踪浏览器用户身份的会话方式。

Cookie:我们知道用户在登录界面的时候会进行登录,那么用户进入主页的时候,由于HTTP1.0的特性,服务器如何知道刚才用户已经登陆过?此时就可以通过Cookie技术来维护应用的状态。

当浏览器请求服务器时,如果服务器需要记录该用户的状态,此时会向浏览器发送一个Cookie,客户端将Cookie保存起来,当用户再次发送请求访问时,浏览器会连同将Cookie发送给服务器,服务器会将接收到的Cookie和保存的记录进行对比,最后得到之前的状态信息

Session:是另一种记录客户状态的机制,但是它保存在服务器中.客户端访问服务器时,服务器自动生成一个Session和唯一标识SessionID,将ID放在响应中发回给浏览器。当浏览器再次访问时讲得到的SessionID放入请求中一并发送,服务器只需根据唯一标识对比查找该客户端的状态即可。

实际上大多数的应用都是依靠Cookie来追踪Session,客户端发送Cookie(SessionID记录在内)给服务器,服务器根据id来查找。那么如果客户端的浏览器禁用了Cookie怎么办?一般情况会使用URL重写的技术来进行会话跟踪,每次HTTP交互,URL后面附加类似sid=xxxx的参数来识别用户

应用场景:Cookie实现自动登录,Session实现判断用户是否登录、购物车等

HTTP常见方法POST、GET

GET方法常用于获取服务器上的某个资源,首行里第一个部分就是GET且请求的body一般是空的。

POST方法多用于提交用户输入的数据给服务器,POST请求的body一般不为空(body的具体格式由header中的Content-Type来描述,具体数据长度由Content-Length来描述)

POST方法和GET的区别?

本质上是一样的,都是HTTP请求基本方法本质是TCP链接,两者其实可以相互替代,GET方法请求的数据会附加在URL之后,以问号分割URL和数据,POST通过body传递参数,所以对于安全性,GET方法指示相对上安全性更高一点,但事实上两个都不是很安全。还有一个区别,GET产生一个TCP数据包,POST产生两个,实际上对于DET方法浏览器会把header和body一同发出去,服务器响应200(表示访问成功)。POST方法一般情况浏览器会分两次发送(在网络环境好的情况下,时间差别是可以忽略的,而在网络不太好的情况下,相反POST方法在验证数据包完整性上有很大的优点)

TCP的三次握手和四次挥手

 

1.服务器新建套接字,绑定地址信息后进入LISTEN状态

2.客户端新建套接字后绑定地址信息调用connect发送连接请求SYN(只有在TCP建立连接时会被置为1,握手完成后为0),序列号seq=x(报文段的编号,在第一个字节的数据编号,本地随机产生的),进入SYN_SENT状态。

3.服务器监听到SYN请求后将其放入内核等待队列,若同意则响应客户端发送SYN和确认报文段ACK=1,seq=y,ack=x+1(ack确认号,期待收到对方下一个报文段的第一个数据字节的序号,也就是客户端最开始的序列号为x,那么ack为x+1),进入SYN_RECD状态。

4.客户端收到后 继续向服务器发送“我已收到”的确认报文段ACK=1 seq=x+1 ack=y+1(因为服务器发送来的序列号为y),并进入ESTABLISHED状态开始读写数据,服务器收到确认报文后,也进入ESTABLISHED状态开始传输数据

 

 

1.客户端主动调用close时,向服务器发送结束报文段FIN报(FIN用来表示释放一个连接)进入FIN_WAIT_1状态。

2.服务器收到关闭连接的FIN报后,返回确认报文段ACK并进入CLOSE_WAIT状态,如果此时服务器还有数据要发送依然可以继续发送,此时连接没有断开。

3.客户端收到服务器的确认后进入FIN_WAIT_2阶段,等待服务器的关闭连接FIN报,此时如果有数据继续接受数据

4.服务器此时数据全部发送完毕后,开始调用close关闭连接,向客户端发送FIN包,进入LAST_ACK状态

5.客户端收到FIN报后进入TIME_WAIT状态(等待2MSL)并且发送确认报文段ACK

6.服务器收到ACK后进入CLOSED状态断开连接

为什么握手是三次,不能是两次或四次?

TCP通信需要确保双方都具有数据收发能力,所以双方都要发送SYN以确保有能力。第一次握手是客户端发送SYN报证明自己的发送能力,第二次是服务器发送SYN和ACK证明自己的接收功能和发送功能“我知道你有这个能力啦,我也有这个能力~”第三次握手,客户端收到并发送ACK,服务器接收到后才知道,客户端的接收能力也正常。

三次握手可以携带数据吗?

第三次可以,第一二次都是发送SYN报,如果有人恶意攻击服务器,每次都在第一次我手掌的SYN报放入大量数据,重复发送大量报文,服务器会花费大量内存来缓冲报文,服务器就更容易被攻击了

为什么握手三次,挥手确实四次?

其实在TCP握手时,接收端将SYN和ACK合并在一个包中,所以减少了一次。对于挥手来说,的那个服务器接收到关闭请求时,服务器并不会iji关闭,只会回确认报跟客户端说“啊,你的请求我知道了,等等,我可能还有数据要发”,客户接收后进入第二等待阶段等待可能客户端发的数据和客户端的关闭连接。所以挥手的接收端不能将FIN和ACK合并一起。

至于在第三次挥手后,客户端发送完确认报(回复服务器的FIN)要等待2MSL再进入CLOSE状态,MSL是指报文在网络中的最大生存时间,如果网络中出现某种问题,确认ACK最终发送到客户端中,客户端会重新发送FIN报。那么2MSL即是报文的一来一回(ACK过去和FIN回来)。如果客户端等了2MSL没有收到FIN报,即确认服务器收到确认ACK,可以进入关闭状态

网络 卧槽!牛皮了,面试官居然把TCP三次握手四次挥手问的这么详细_WhiteShirtI的博客-CSDN博客_tcp三次握手失败

计算机网络体系结构

 

物理层 

管理维护物理连接,确定传输媒体特征,提供比特流传输服务,对数据链路层屏蔽物理设备以及协议上的差异

数据链路层

接收网络层的ip数据包,将其添加收尾封装成。物理层是比特流的传输,实际上的不可靠的,那么数据链路层咋物理层的基础上提供差错检测(对于传输中出错的帧进行丢弃)、差错控制、流量控制等,提供一个可靠的传输

网络层

无连接,不可靠尽量交付数据包的服务 。有主机的运输层负责对进程提供可靠性的服务,为分组交换网上的不同主机提供通信服务

网络层最重要的协议——IP协议(约定发送位置)

运输层

提供端对端的连接和数据传输服务(进程对进程),主要有TCP UDP协议进行传输报文

  1. TCP向它的应用程序提供面向连接的服务,它能够控制并且可以确认报文是否已经到达,当网络拥塞时会抑制其传输速率
  2. UDP协议向它的应用提供屋里阿杰的服务,它不具备可靠的特征,没有流量控制,也没有拥塞控制,将运输层的分组称为报文段

应用层

通过规定进程间的交互来完成特定网络应用,应用层包括很多协议,例如HTTP、FTP、域名解析DNS协议

(8条消息) 计算机网络五层模型详解_啦啦拉德玛西亚的博客-CSDN博客_五层网络模型

看完这篇HTTP,跟面试官扯皮就没问题了_程序员cxuan的博客-CSDN博客_accept-charset和accept-encoding

网络传输数据的过程

  1. 当我们在浏览器输入URL时,浏览器会对URL进行解析从而生成发送给Web服务器的请求消息
  2. 省略文件名的情况,假如访问的百度网址后面应该有具体文件名但是被忽略了,一般浏览器会默认访问/index.html或者defaul.html,当然一般服务器会实现设置好文件名省略时默认访问的文件名。
  3. 解析完URL之后,浏览器就知道该访问哪里,根据得到的消息生成HTTP请求消息然后委托给操作系统来实现发送,委托操作系统发送请求时必须要提供IP地址,所以在这之前要去DNS查询服务器域名对应IP地址,调用自身的DNS解析器向DNS服务器发送查询信息(当然发送消息的过程同样委托给操作系统来完成)并接受DNS服务器返回的响应信息(依靠自身的DNS客户端解析返回的响应信息 
  4. 发送消息给服务器后,服务器会发回响应消息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值