1.TCP的三次握手和四次握手
建立TCP的话,需要三次握手才能建立,而断开连接则需要四次挥手
三次握手:通俗描述就是(最主要是防止已过期的连接再次传到被连接的主机)
三次握手改成仅需要两次握手,可能发生死锁
(1) A对B说:我的序号是x,我要向你请求连接;(第一次握手,发送syn包,然后进入syn-send状态)
(2)B听到之后对A说:我的序号是y,期待你的下一句是x+1,同意建立连接(第二次握手,发送ack-syn包,然后进入syn-rcvd状态)
(3)A听到B说同意建立连接之后,对B说:已确认你同意和我连接(确认号ack=y+1,确认ACK=1,序列号seq=x+1)。(第三次握手,A已经进入established状态)
(4)B听到A的确认后,也进入established状态
四次挥手:通俗描述就是
(1) A与B交谈结束之后,A要结束此次会话,对B说:我要关闭连接了(序列号seq=u,终止FIN=1)。(第一次挥手,A进入FIN-WAIT-1)
(2)B收到消息后说:收到,你要关闭连接了。(序列号seq=v,
确认号ack=u+1,确认ACK=1)(第二次挥手,B进入CLOSE-WAIT)
(3)A收到B的确认后,等待了一段时间,因为B可能还有话要说。(此时A进入FIN-WAIT-2)
(4)B说完了它要说的话(只是可能还有话要说)之后,对A说,我要关闭连接了。(序列号seq=w,确认号ack=u+1,终止FIN=1,确认ACK=1)(第三次挥手)
(5)A收到B要结束的消息后说:已收到你要关闭连接的消息。(seq=u+1,ack=w+1,ACK=1)(第四次挥手,A进入到CLOSED状态)
(6)B收到A的确认后,也进入CLOSED状态
【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
---------------------
原文:https://blog.csdn.net/baixiaoshi/article/details/67712853
2.TCP和UDP的区别
Tcp是传输控制协议,UDP是用户数据报协议
TCP面向连接;UDP是无连接的
TCP传输数据比较慢,但是无差错,不重复,不丢失,基于字节流的运输层通信协议;UDP则具有较好的实时性,工作效率高,面向报文适用于高速传输和实时性较高的通信,但是不保证可靠交付。
TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式;
TCP对系统资源要求较多,UDP对系统资源要求较少
用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535- IP头(20) - UDP头(8)=65507字节。用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误。
用TCP协议发送时,由于TCP是数据流协议,因此不存在包大小的限制(暂不考虑缓冲区的大小),这是指在用send函数时,数据长度参数不受限制。而实际上,所指定的这段数据并不一定会一次性发送出去,如果这段数据比较长,会被分段发送,如果比较短,可能会等待和下一次数据一起发送。
对于可靠性,TCP通过以下方式进行保证:
数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;
对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;
丢弃重复数据:对于重复数据,能够丢弃重复数据;
应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;
超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;
流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。
https://blog.csdn.net/caoshangpa/article/details/51530685
3.TCP/IP五层协议与OSI七层
(1)OSI七层模型
OSI中的层 功能 TCP/IP协议族
应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层 数据格式化,代码转换,数据加密没有协议
会话层 解除或建立与别的接点的联系 没有协议
传输层 提供端对端的接口 TCP,UDP
网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2
(2)TCP/IP四层模型的协议
应用层:向用户提供调用和访问网络中各种应用程序的接口
传输层:提供端到端的可靠的或不可靠的通信服务
网际层:主要负责相邻节点之间,数据分组的逻辑(ip)地址寻址与路由
网络接口层: 主要负责通过网络发送和接受IP数据报
1、一般TCP/IP的应用层或者OSI的会话、表示、应用层把数据称为数据或者信息,到了传输层把数据称为报文,到了最底层就是比特流了也就是字节流
2、字节就是散乱的数据 报文就是添加了标记,封装后的数据
五层
应用层———消息
传输层———数据段(segment)
网络层———-分组、数据包(packet)
链路层———-帧
物理层———-PDU(bit比特)
1、报文
报文是网络中交换和传输的数据单元,也是网络传输的单元。报文包含了将要发送的完整的数据信息,其长短不需一致。报文在传输过程中会不断地封装成分组、包、帧来传输,封装的方式就是添加一些控制信息组成的首部,那就是报文头。
2、分组
分组是在网络中传输的二进制格式的单元。用户发送的数据会被分成多个更小的部分,在每个部分的前面加上一些必要的控制信息组成的首部,有时也会加上尾部,就构成了一个分组。
3、数据包
数据包是tcp/ip协议通信传输中的数据单元,也称为包。数据包是从最上层,一层一层封装,知道网络层的,最后借助数据链路层发送出去的数据单元。
4、数据报
面向无连接(UDP)的数据传输,工作过程类似于报文交换。采用数据报方式传输时,被传输的分组称为数据报。
5、帧
帧是数据链路层的传输单元。将上层传输的数据添加一个头部和尾部,组成了帧。
物理层:中继器、集线器、还有我们通常说的双绞线也工作在物理层
数据链路层:网桥(现已很少使用)、以太网交换机(二层交换机)、网卡(其实网卡是一半工作在物理层、一半工作在数据链路层)
网络层:路由器、三层交换机
传输层:四层交换机、也有工作在四层的路由器
4.GET和POST的区别
GET请求把参数包含到URL里,POST通过request body来传递函数,
大多时候get用来获取数据,post用来传递数据
但其实get请求里也可以添加request body,post可以带上url参数
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
从请求的大小看,GET请求的长度受限于浏览器或服务器对URL长度的限制,允许发送的数据量比较小,而POST请求则是没有大小限制的。
但是由于服务器原因,可能会选择忽略这些数据。
GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
最重要一点:然后GET是产生一个数据包,post产生两个数据包
对于GET请求来说,浏览器会把HTTP header和data一次性发送出去,
而post先发送HTTP header 服务器返回100 continue,再发送data
5.当你输入一个网址/点击一个链接,发生了什么?
(1)当发送一个URL请求时,浏览器会开启响应的一个线程来处理这个请求,同时在远程DNS服务器上启动一个DNS查询,找到对应的ip地址
(2)浏览器与远程web服务器通过TCP三次握手来建立一个TCP/IP连接。
(3)一旦建立连接,浏览器会通过该连接向远程服务器发送HTTP的GET请求。远程服务器找到资源后并使用HTTP响应返回该资源。
6.TCP的拥塞控制
1. 拥塞:即对资源的需求超过了可用的资源。若网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降。
拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。
流量控制:指点对点通信量的控制,是端到端正的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
拥塞控制代价:需要获得网络内部流量分布的信息。在实施拥塞控制之前,还需要在结点之间交换信息和各种命令,以便选择控制的策略和实施控制。这样就产生了额外的开销。拥塞控制还需要将一些资源分配给各个用户单独使用,使得网络资源不能更好地实现共享。
2. 几种拥塞控制方法
慢开始( slow-start )、拥塞避免( congestion avoidance )、快重传( fast retransmit )和快恢复( fast recovery )。
2.1 慢开始和拥塞避免
发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞。
发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
慢开始算法:当主机开始发送数据时,如果立即所大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。因此,较好的方法是 先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口 cwnd ,可以使分组注入到网络的速率更加合理。
7.cookie和session区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中(搜索历史 访问站点所打的文字和选择等)
cookie的弊端:
cookie:数量和长度的限制
安全性问题:如果被拦截,就可获取所有的session信息
每次访问都要传送cookie给服务器,浪费带宽
有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。
8.HTTP HTTPS的区别
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
https之所以比http安全,是因为他利用ssl/TLS协议传输。它包含证书,卸载,流量转发,负载均衡,页面适配,浏览器适配,refer传递等。保障了传输过程的安全性
9. HTTP状态码
hTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码类型
1**:信息,服务器收到请求,需要请求者继续执行操作
2**:成功,操作被成功接收并处理
3**:重定向,需要进一步操作以完成请求
4**:客户端错误,请求包含语法错误或无法完成的请求
5**:服务器错误,服务器在处理请求过程中发生了错误
200 请求成功。
206 部分内容。服务器成功处理了部分get请求
迅雷等通过此类(响应实现断点续传或者将一个大文档分解为多个下载段同时下载)
http请求字段range:
格式: Range: bytes=start-end
请求资源的部分内容(不包括响应头的大小),单位是byte,即字节,从0开始.
如果服务器能够正常响应的话,服务器会返回206 Partial Content 的状态码及说明.
如果不能处理这种Range的话,就会返回整个资源以及响应状态码为 200 OK.
http的header分割符:\r\n
301 永久移动,请求资源已被永久的移动到新的URL
302 临时移动 资源只是临时被移动。客户端应继续使用原有URI
400 客户端请求的语法错误,服务器无法理解
401 请求需要用户的身份认证
403 服务器理解客户端的请求,但是拒绝执行此请求
404 服务器无法根据客户端的请求找到资源
500 服务器内部错误,无法完成请求
503 超载或系统维护,服务器暂时无法处理客户端的请求
。
10.HTTP协议的主要特点及组成
简单快速、灵活、无连接、无状态
简单快速:统一资源服务器、资源地址时固定的,请求资源只需传送对应的路径和方法即可
灵活:HTTP允许传输任意类型的数据对象。同一个http协议可以完成不同数据类型的传输
无连接:每次处理完请求后,连接就会断开
无状态:每次请求处理完断开,都不会有记录信息,再次请求,服务端也不能识别是否时同一个客户端。
组成:
报文分为:请求报文、响应报文
请求报文包括:
-请求行:主要包括请求方法、页面地址、协议版本
-请求头:由KEY/value组成,告诉服务端需要的资源类型
-空行:表示请求头结束,下边的都是请求体内容
-请求体:包括请求的一些数据
响应报文:响应行、响应头、空行与请求报文相差不多
11.socket接套字
包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。