Http、Socket、Tcp简单详解

在这里插入图片描述

1.传输层TCP、UDP

  TCP:面向连接可靠的传输。

  • 连接:三次握手、四次分手
  • 可靠:通信可靠的,一问一答模式

1.1 图解如下:

在这里插入图片描述

1.2 为什么需要三次握手?

握手次数clientserver
第一次握手什么都不能确认确认 client 发送正常
第二次握手确认 client 发送/接收正常,确认 server 发送/接收确认确认 client 发送正常,确认 server 接收正常
第三次握手确认 client 发送/接收正常,确认 server 发送/接收确认确认 client 发送/接收正常,确认 server 发送、接收正常

  最终通过三次握手,client 和 server 都确认了对方和自己发送/接收正常

1.3 两次握手会有啥问题?

  现在把三次握手改成仅需要两次握手,死锁是可能发生的。
  作为例子,考虑计算机 server 和 client 之间的通信,假定 client 给 server 发送一个连接请求,server 收到了这个请求,并发送了确认应答。按照两次握手的协定,server 认为连接已经成功地建立了,可以开始发送数据包。
  可是,client 在 server 的确认应答在传输中被丢失的情况下,不知道 server 是否已准备好,client 甚至怀疑 server 是否收到自己的连接请求。在这种情况下,client 认为连接还未建立成功,将忽略 server 发来的任何数据包,只等待连接确认应答。而 server 在发出的数据包超时后,重复发送同样的数据包。这样就形成了死锁。

1.4 四次挥手

挥手次数clientserver
第一次挥手Clien 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状态
第二次挥手Server 收到 FIN 后,发送一个 ACK 给 Client, Server 进入 CLOSE_WAIT 状态
第三次挥手Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态。
第四次挥手Client 收到 FIN 后,Client 进入TIME_WAIT状态,发送 ACK 给 Server,Server进入CLOSED 状态,完成四次握手

1.5 为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

  建立连接时,Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。
  关闭连接时,Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个 ACK 报文,告诉 Client端,“你发的 FIN 报文我收到了”。只有等到我 Server 端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送。故需要四步握手。

1.6 如果已经建立了连接,但是客户端突然出现故障了怎么办?

  TCP 还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

1.7 抓取tcp连接数据包

  在虚拟机上执行如下命令抓取数据包:
在这里插入图片描述

  网卡号,可以通过ifconfig命令查看。连接百度

在这里插入图片描述

  这边打印出了三次握手数据包

在这里插入图片描述

  接下来使用curl命令,快速和百度建立连接、发送数据、断开连接

在这里插入图片描述

  查看数据包打印如下:

在这里插入图片描述

  分析:前面三次是三次握手数据包,后面四次是四次分手数据包。中间传输数据,加上了应用层的数据,封装的数据包。

2. Socket

  Socket:套接字(ip + port :ip + port),ip + port :ip + port构成唯一连接。是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示。

3. 传输控制层

  传输控制层:向高层提供可靠的端到端的网络数据流服务,也就是造握手包/数据包。

4. 网络层

  网络层:通过路由表寻址,找到了下一跳ip地址及知道自己想访问的服务端ip 和端口

  下一跳:路由器收到任意IP包之后,都要根据IP包中携带的目的IP在本地的路由表中找到匹配的路由,然后把该IP包转发到该路由指定的下一跳去。(cmd:route print)

5. 链路层

  链路层:通过下一跳的ip地址找到对应的网卡地址(Mac)。数据包封装 服务端(ip + 端口) + Mac(下一跳硬件地址)

在这里插入图片描述

6. 物理层

  物理层:物理层负责最后将数据包编码成电流脉冲或其它信号用于网上传输;

7. Http、tcp、Socket的关系

  tcp 是一个基础通信的连接层次,而 Socket 封装了 tcp、udp。而 java 中 channel 包装了 socket,而channel 流入流出的数据,可以通过协议去约束、识别,比如:http、redis等。

  面试题:如果一个客户端使用java循环发送http1.1请求,而不断开tcp连接,会引发什么问题。

  • 客户端内核循环创建新 socket,申请占用端口,达到了65535上限,客户端报错Address already in use: connect。

  Http1.1 默认使用keepalive 保持长连接,需要客户端主动进行四次挥手,原理是应用层加了一个标志,控制传输控制层要不要进行四次挥手。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值