请问TCP三次握手是怎样的
首先:客户端发送同步信号SYN = 1、seq = x到服务端
服务端收到之后,SYN= 1,seq = y、ack = x+1到客户端
客户端收到之后,SYN = 1、ack = y+1到服务端,连接建立
TCP握手为什么两次不行,为什么不用四次
首先来分析一下握手的过程
-
A发送同步信号SYN 与seq序号
-
B收到后返回ACK确认序号
-
B收到后返回seq和SYN
-
A收到后返回ACK
实际上是通过上面四步走的
但是23是可以合并的,因此实际上是三次握手,那么如果四次握手的话,会导致连接的速度与效率,如果两次握手呢 -
A发送同步信号SYN ,seq
-
B收到后返回SYN+ACK+seq
看出来了吗,如果只有两次握手,那么A可以知道B与自己的出实序列号一致,也就是说A是可以和B进行通讯的,但是,B无法知道A是否已经收到了自己的信息,无法确认下一条数据是在什么地方开始发送,自然也就不能随便的发送数据,无法通讯,并且由于TCP是全双工通信,这样的话,违背了其设计
总结
通过上面的描述,可以得出结论,如果挥手四次,造成连接的速度与效率降低,如果挥手两次,只能完成一方的通讯,因此三次才是最好的选择。
请你来说一下TCP拥塞控制
拥塞控制是通过窗口进行实现的
在发送方会维持一个拥塞窗口的状态变量,其大小取决于网络的拥塞成都,并且他是动态的变化的;
拥塞控制有三步
- 慢启动:最开始的时候,窗口设计的大小为1;
- 拥塞避免:在慢启动里面,每次收到一个确认就以*2的倍数扩大窗口,如果窗口一直以两倍的方式进行扩大,很快就会导致网络拥堵,所以当窗口的大小更改到系统设定的阙值,当窗口的值达到系统设定的阙值之后,以+1的方式线性扩大窗口,在窗口的大小以内,数据是不同等确认到来之后再发送数据,而是可以直接发送的;并且将超时冲床看作是拥塞,当发送超时重传的时候,将阙值设定为当前窗口的一般,然后将窗口的大小回复至1,重新进入慢启动的过程;
- 快速重传:当遇到三次重复的确认应答的时候,代表收到了三个报文段,但是之前有报文段丢失了,所以会对这个丢失的报文段进行立即重传,然后将阙值设定为当前窗口的一半,窗口的大小设定为,慢启动阙值+3的大小;
TCP和UDP的区别与各自使用的场景
TCP与UDP的区别
- TCP是面向连接的 ,UDP是无连接的
- TCP提供可靠的连接,UDP不提供:TCP通过三次握手来建立连接,通过拥塞控制,超时重传、确认应答来实现可靠交付;UDP只是尽最大努力去保证交付的可靠性
- TCP工作效率第,因为其保证传输数据的正确性机制很多,造成了TCP网络开销很大,工作效率低下,UDP传输控制简单,工作效率相对高
- TCP传输数据的控制机制多,大幅度的降低了数据传输的实时性,UDP协议简单,数据实时性较高
- 服务对象不同:TCP是点对点的服务,UDP支持一对多、多对一、多对多的交互通信;
TCP与UDP的适用场景
- 对数据质量要求高,但是对实时性要求不高的,使用TCP如传输文件、发送邮件等
- 对数据的实时性要求比较高,但是对传输质量要求低,如视频通话,语音通话等;
请你来说一下TCP三次握手四次挥手的过程
前一篇博客很纤细的讲解了
计算机网络
说一说HTTP协议
概念: HTTP协议定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器,从层次的角度看,HTTP是面向事务的应用层协议,它规定了在浏览器和服务器之间的请求和相应的格式和规则,他是万维网上能够可靠交换文件(包括文本、声音、图像等各种多媒体文件的重要基础)
** HTTP的操作过程:**从协议的执行过程来说,浏览器要访问www服务器时,首先要完成对www服务器的域名解析,一旦获得了服务器的IP地址,浏览器将通过TCP向服务器发送连接建立请求
万维网大致工作过程如下
每个万维网站点都有一个服务进程,它不断江亭TCP的端口,当监听到连接的请求后,便与浏览器建立连接,当TCP连接建立后,浏览器就向服务器发送请求获取某一web页面的http请求,当服务器收到http的请求后,将构建锁清秋的web页必须的信息,并通过http相应返回给浏览器,浏览器再将信息进行解释,然后将web页显示给用户,最后,TCP连接释放;
根据浏览器和服务器之间的请求和相应交互,必须按照规定的格式最受一定的规则,这些格式和规则就是HTTP,因此HTTP有两类保温:
- 请求保温,从Web客户端向Web服务器发送服务请求
- 响应保温:从Web服务器对Web客户端请求的回答;
当用户点击鼠标后所发生的事件时间顺序如下
- 浏览器首先要分析连接指向页面的URL(http://www.tsinghua.edu.cn/publish/thu2018/index.html);
- 浏览器向DNS请求解析www.tsinghua.edu.cn的IP地址
- 域名系统DNS解析处清华大学的服务器的IP地址;
- 通过IP地址与使客户端与服务器建立TCP连接
- 浏览器发送HTTP请求:GET /publish/thu2018/index.html;
- 服务器通过HTTP响应把文件index.html发送给浏览器;
- TCP连接释放;
- 浏览器将文件index.html进行解释,并将Web页显示给用户
协议特点
- HTTP协议使无状态的
同一个客户第二次访问同一个服务器上的页面时,服务器的相应于第一次被访问的相同。因为服务器并不记得曾经访问过的这个用户,也不记得为该用户曾经服务过多少次 - HTTP采用TCP作为运输层协议,保证了数据的可靠传输:
HTTP不必考虑数据在出阿叔过程中被丢弃后又怎样被重传; - HTTP协议时无连接的: 虽然HTTp使用了TCP连接,但是通信双方在交换HTTP保温之前时不需要先建立HTTP连接的
- HTTp既可以使用飞驰就连接,也可以使用持久连接
HTTP的报文结构
HTTP是面向文本的,因此在报文中的每个字段都是一些ASCLL码串,并且每个字段的长度都是不确定的,有两类HTTp报文;
5. 请求报文:从客户端向服务器发送的请求报文 图2
6. 相应报文:从服务器到客户端的回答 图3
HTTP请求报文中常用的几个方法:
- GET 请求读取由URL所标记的信息;
- HEAD:请求读取由URL所标记的信息的首部;
- POST:给服务器添加信息(例如:注释)
- CONNECT:用于代理服务器
请你来说一下GET和POST的区别
区别:
- 传递方式:get通过地址栏传输,post通过报文传输
- 传输长度:get参数有长度限制(受限于url长度),而post没有限制
- get产生一个TCP数据包,post产生两个TCP数据包:对于个体来说会将http header和data一起发送出去,服务器响应,而对于post来说,浏览器首先发送header,服务器响应1xxx,然后浏览器再法data,服务器响应2xxx,通俗点讲,如果用在货物传输上,get相当于一次性的把货送到了,而post需要两次,第一个告诉一会有一批货,第二次再发送货
- get产生的url是可以被Bookmark(也就是可以被记录的),而post不会
- get请求会被浏览器主动cache,erpost不会,除非手动设置
- get请求只能进行url编码,而post支持多种编码方式
- get请求参数会被完整保留再浏览器的历史记录中,而post中的参数不会被保留
- get比post不安全,因为其参数直接暴漏再url上,所以不能用来传输敏感信息
- get参数通过url传递,而post放在requestbody中
请你来说一下socket编程中服务器端和客户端主要用到那些函数
基于TCP的socket
基于UDP的连接
请你说一下阻塞,非阻塞,同步,异步
阻塞和非阻塞:在调用者等待发生的事情一直没有发生的时候,一个是一直等在原地,并不去执行别的任务,这叫阻塞,反之不等待的话,就叫非阻塞
同步和异步:调用者必须循环去查看事件有没有发生,这种情况是同步,调用者不需要字节去查看时间有没有发生,而是等待着注册在事件上的回调函数通知自己,这种情况是异步
请你说一说TCP/IP数据链路层的交互过程
当数据报到达网络层,准备向数据链路层发送的时候,首先在网络层的arp缓存表中查找目标IP的mac地址,如果查到,就将目标IP的mac地址封装到链路层数据报的报头,如果没有找到,就发起一个广播,所有收到广播的机器会看这个ip是不是自己的,不是则抛弃,是则将自己的mac地址回复给请求的机器
请你来介绍一下udp的connect函数
udp客户端建立了socket后可以直接调用sendto()函数向服务器发送数据,但是需要在sendto()函数的参数中指定目的地址/端口,但是可以调用connect()函数先指明目的地址/端口,然后就可以使用send()函数向目的地址发送数据了,因为此时套接字已经包含目的地址/端口,也就是send()函数已经知道包含目的地址/端口。
udp通讯中的connect()和bind()函数