Java—TCP与HTTP连接
输入一个url到浏览器页面展示过程:
- 输入网址
- 缓存解析
- 域名解析
- tcp连接,三次握手
- 服务器处理请求并返回报文
- 页面渲染
TCP传输控制协议/UDP用户数据报协议:
- TCP面向连接、字节流、全双工的可靠信道,发送端时经过各层时都要附加上相应层的协议头和协议尾(仅数据链路层需要封装协议尾)部分,与原数据大小不同。
- UDP无连接、报文流、不可靠信道,发送时与原数据大小相同。
- 接收缓冲区被TCP和UDP用来缓存网络上来的数据,一直保存到应用进程读走为止。对于TCP,如果应用进程一直没有读取,buffer满了之后,发生的动作是:通知对端TCP协议中的窗口关闭。这个便是滑动窗口的实现。保证TCP套接口接收缓冲区不会溢出,从而保证了TCP是可靠传输。因为对方不允许发出超过所通告窗口大小的数据。 这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接收方TCP将丢弃它。
- UDP:当套接口接收缓冲区满时,新来的数据报无法进入接收缓冲区,此数据报就被丢弃。UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的UDP丢弃数据报。
流量控制:
TCP中采用滑动窗口来进行流量控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据报。
拥塞控制:
拥塞窗口指某一源端数据流在一个RTT内可以最多发送的数据包数。
防止发送方发的太快,使得网络来不及处理,从而导致网络拥塞
- 慢启动: 网络传输刚开始时,并不知道网络的实际情况,所以采取一种试探的方式控制数据的发送速率。慢启动阶段,数据的发送速率以指数方式增长,即就是拥塞窗口的增长,每次都是收到确认报文段数量的2倍。可以看出慢启动并不慢,拥塞窗口增长的速度很快。所以,为其设置了一个慢启动门限,当达到门限时,就进入到拥塞避免阶段。
- 拥塞避免: 当拥塞窗口的大小采用慢启动方式增长到慢启动门限时,就进入拥塞避免阶段,拥塞避免阶段不再以指数形式增长拥塞窗口,而是每经过一个往返时间RTT就将发送方的拥塞窗口+1, 使其增长速度减缓。按照线性方式增长。如果发生网络拥塞,比如丢包时,就将慢启动门限设为原来的一半,然后将拥塞窗口设置为1,开始执行慢启动算法。(较低的起点,指数级增长)。
- 快速重传: 假设发送方发送的报文段分别为: M1,M2,M3,M4,M5,M6 , 当接收方收到M1和M2后,M3报文段丢失,接着收到的M4,M5,M6都不做处理,而是没接收到一个报文段就对M2重复确认,发送方接收到重复的三次确认报文段,就对其后的报文段进行重新发送,而不需要等待超时时间到达。当快速重传后,立即进入到快速恢复阶段。
- 快速恢复:将慢启动门限设置为原来的一半,然后将拥塞窗口设置为现在的慢启动门限值,不再执行慢启动算法,而是直接进入拥塞避免阶段。使发送窗口成线性方式增大。
TCP连接:
- ACK:确认序号有效。
- SYN:发起一个新连接。
- FIN:释放一个连接。
握手(挥手)过程中必须有SYN(FIN)与ACK在同一次握手(挥手)当中传输,意味着确定打开(关闭)连接了。
TCP的三次握手:
- ack = 另一端发送的seq + 1
- seq = 另一端发送的ack
- 另一端没有发送则建新值
第三次握手原因:
防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
TCP的四次挥手:
挥手需要四次原因:
第二次只发送ACK,但是还不能发送FIN,因为服务端还有数据没发完,所以在CLOSE-WAIT阶段等待剩余数据的发送,发送完数据则发送ACK+FIN跟客户端确定可以关闭连接了,进入LAST-ACK阶段等待最后一次确定状态,客户端再发送一次ACK确定收到关闭连接消息,服务端就进入CLOSED。
客户端在TIME-WAIT等待2MSL原因:
MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。
防止服务端没有收到最后一次ACK,因为服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文。
HTTP协议:
1.请求报文
- 请求行 请求方法(Method)、URL字段和HTTP协议版本
- 请求头 存放对客户端想给服务端的附加信息
- 请求体 真正需要发给服务端的数据
2.响应报文
- 响应状态行 状态行是服务端返回给客户端的状态信息,包含HTTP版本号、状态码、状态码对应的英文名称。
- 响应头与响应实体
- HTTP是基于TCP的,客户端往服务端发送一个HTTP请求时第一步就是要建立与服务端的TCP连接,也就是先三次握手
- socket层只是在TCP/UDP传输层上做的一个抽象接口层,因此一个socket连接可以基于TCP连接,也有可能基于UDP。
- HTTP采用“请求-响应”机制,在客户端还没发送消息给服务端前,服务端无法推送消息给客户端。必须满足客户端发送消息在前,服务端回复在后。Socket连接双方类似peer2peer的关系,一方随时可以向另一方喊话。
get和post的区别
功能不同:
- get是从服务器上获取数据。
- post是向服务器传送数据。
过程不同:
- 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
- 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
传送数据量不同
- get传送的数据量较小,不能大于2KB。
- post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
安全性不同
- get安全性非常低。
- post安全性较高。
对称加密
- 客户端和服务器共用同一个密钥,该密钥同时用于加密和解密一段内容。
- 对称加密的优点是加解密效率高,但是在安全性方面可能存在一些问题,因为密钥存放在客户端有被窃取的风险。对称加密的代表算法有:AES、DES等。
非对称加密
- 将密钥分成了两种:公钥和私钥。
- 公钥通常存放在客户端,私钥通常存放在服务器。
- 使用公钥加密的数据只有用私钥才能解密,反过来使用私钥加密的数据也只有用公钥才能解密。
- 非对称加密的优点是安全性更高,因为客户端发送给服务器的加密信息只有用服务器的私钥才能解密,因此不用担心被别人破解,但缺点是加解密的效率相比于对称加密要差很多。非对称加密的代表算法有:RSA、ElGamal等。
HTTP无状态:
无状态是指,当浏览器给服务器发送请求的时候,服务器响应客户端请求。
但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道他就是刚才的那个浏览器。
简单的说,就是服务器不会去记得你,所以就是http的无状态协议。
保存用户状态的两大机制:
HTTP与HTTPS:
- HTTP+SSL(Secure Sockets Layer 安全套接字协议),
- 传统的http方式传输数据时信息都是明文的,数据很容易被监听和窃取。传输的数据还有可能被一些别有用心的人篡改,导致浏览器与网站收发的内容不一致。
- HTTPS采用对称加密+非对称加密的方式
SSL协议的握手过程
- 网页给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。
- 网站确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。
- 网页确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给网站。
- 网站使用自己的私钥,获取网页发来的随机数(即Premaster secret)。
- 网页和网站根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(session key),用来加密接下来的整个对话过程。
浏览HTTPS网站过程:
浏览器随机生成密钥,然后用CA机构发的公钥加密一层,传输到网站后,网站获得密钥。网站收到了浏览器随机生成的密钥之后,双方就可以都使用对称加密来进行通信了。
浏览器获取网站的公钥,以及保证公钥的安全性由CA机构保证。
- CA机构则会使用网站管理员提交的公钥,再加上一系列其他的信息,如网站域名、有效时长等,制作证书。
- 有浏览器请求网站时,首先会将这段加密数据返回给浏览器,此时浏览器会用CA机构的公钥来对这段数据解密。
- 如果能解密成功,就可以得到CA机构给我们网站颁发的证书了,其中包括了网站的公钥。
单向认证、双向认证
单向认证指的是只有一个对象校验对端的证书合法性。通常都是client来校验服务器的合法性。那么client需要一个ca.crt,服器需要server.crt,server.key
双向认证指的是相互校验,服务器需要校验每个client,client也需要校验服务器。server 需要 server.key 、server.crt 、ca.crt。client 需要 client.key 、client.crt 、ca.crt。
Java—TCP与HTTP连接相关推荐
- java tcp 三次握手_用Java代码分析TCP的三次握手四次挥手过程
(1)客户端发送一个带SYN标志的TCP报文到服务器.这是三次握手过程中的报文1. (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志.因此它表示对刚才客户 ...
- Java TCP 编程简介
一.TCP 协议简介 http://blog.csdn.net/nvd11/article/details/40954043 之前的博文简单介绍了网络编程中的UDP协议 其实更常用的网络协议是TCP协 ...
- Java TCP/IP Socket 编程 笔记
http://jimmee.iteye.com/blog/617110 http://jimmee.iteye.com/category/93740 Java TCP/IP Socket 编程 笔记( ...
- java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?
我在java中设置一个简单的TCP客户端服务器交互. 服务器: 服务器是用Java编写的桌面客户端: import java.io.BufferedReader; import java.io.Dat ...
- java tcp 编程实例_Java实现基于TCP的通讯程序实例解析
Java中的TCP通信程序 TCP可以实现两台计算机之间的数据交互通信的两端,要严格区分客户端与服务端 两端通信时的步骤: 1.服务端程序,需要事先启动,等待客户端连接 2.客户端主动连接服务器端,才 ...
- tcp网络通信教程 java_基于java TCP网络通信的实例详解
JAVA中设计网络编程模式的主要有TCP和UDP两种,TCP是属于即时通信,UDP是通过数据包来进行通信,UDP当中就会牵扯到数据的解析和传送.在安全性能方面,TCP要略胜一筹,通信过程中不容易出现数 ...
- Java TCP/UDP编程
java TCP & UDP编程 UDP编程 TCP编程 UDP编程 UPD: User Datagram Protocol.面向无连接,不安全. UDP中,发送方无需知道接收方是否接受,只考 ...
- java tcp 阻塞等待应答_面试常问!TCP 的三次握手与四次挥手理解
来源:青柚_ blog.csdn.net/qq_38950316/article/details/81087809 三次握手过程理解 四次挥手过程理解 常见面试题 先来张图! 序列号seq: 占4个字 ...
- Java TCP实现高仿版QQ聊天(一)
前言 记录一下这套简陋的系统说明,把所遇到的问题和难点以及操作说明在这篇文档中说明清楚,当个回顾吧,万一以后那一天查看也能及时找到问题.这套系统是在本人大三时期完成的,从GitHub上借鉴了很多经 ...
最新文章
- 基于SSH框架实际开发时遇到的问题及解决办法
- 开源一个上架App Store的相机App
- 写代码如坐禅:你是哪一类程序员?
- 支付宝WAP支付接口开发
- 分享一个SQL文件的合并的小程序
- Git和SourcesTree的安装
- 小学奥数 地球人口承载力估计
- 【渝粤教育】国家开放大学2018年春季 0554-22T立体构成(一) 参考试题
- FreeSwitch给会议室人员增加标识
- CAD转GIS工具软件下载
- ibm服务器远程管理口 口令,IBM X系列服务器|IMM2设置远程管理口|默认IP
- Nebula Graph - 基于Docker 安装 及 Studio
- Mysql 当前月每天累计统计,Mysql 本月第一天
- 【注意力机制集锦2】BAMSGEDAN原文、结构、源码详解
- Vue-basic 19.单文件组件
- 领英不能加人怎么办?
- ICP许可证怎么申请?
- 卡西欧计算机亮度,卡西欧怎么调3秒灯
- windows小技巧---复制百度文库vip内容/解决微信文件过大
- 小技巧: 掀开 Metacity 的同化殊效
热门文章
- 打了断点为直接运行完_黑社会行为?男子驾校身亡,家属看现场被保安围殴,手臂被打断...
- flink sql udf jar包_Java动态加载Jar实例解析
- 用户关系表 存储_如何解决oracle 19c中创建用户报错的故障
- 「第四篇」电赛控制题可以准备一些什么?
- 电源开关上的 | 和 O 究竟代表了什么?
- 40岁“老程序员”的“辛酸”自述:
- java负数转换二进制表示_Java中的负数的在计算机中的二进制表示,以及与十进制的相互转换...
- kernelbasedll下载_kernel32.dll
- 服务器放n个网站,服务器放n个网站
- 安卓键盘加上数字_Android自定义键盘的实现(数字键盘和字母键盘)