本文章是我自己在自学网络方面所记录的笔记,现在分享给大家,有不懂或没学过的以及想学习了解网络这方面的知识的猿友们,可以耐心的看看这篇文章,主要讲解TCP、UDP、HTTP三个协议。
握手是为了建立连接,在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
Flag | 说明 |
URG | 紧急指针标志 |
ACK | 确认序号标志 |
PSH | push标志 |
RST | 重置连接标志 |
SYN | 同步序号,用于建立连接过程 |
FIN | finish标志,用于释放连接 |
第一次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到武器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHEN(established)状态,完成 三次握手。
为了初始化Sequence Number的初始值。
Server收到Client的SYN。回复SYN-ACK的时候未收到ACK确认,Server不断充实直至超时,Linux默认等待63秒才断开连接。Liunx默认重发次数为5次,重发次数时间翻倍。
1s-->2s-->4s-->8s-->16s:31s;第五次还需要等待32s。
SYN队列满后,通过tcp_syncookies参数回发SYN Cookie(原地址端口+目标地址端口+时间戳),Sequence Number简称SYN Cookie。
若为正常连接则Client会回发SYN Cookie,直接建立连接。
保活机制:向对方发送保活探测报文,如果未收到相应则继续发送尝试次数达到保活探测数仍未收到响应则中断连接。
挥手是为了终止连接。
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态;
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为 收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态;
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态;
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
原因:
确保有足够的时间让对方收到ACK包;
避免新旧连接混淆。
因为全双工,发送方和接受方都需要FIN报文和ACK报文
对方关闭socket连接,我方忙于读或写,没有及时关闭连接。
检查代码,特别是释放资源的代码
检查配置,特别是处理请求的线程配置
RTT:发送一个数据包到收到对应的ACK,所花费的时间
RTO:重传时间间隔,通过RTT计算出来的
保证TCP的可靠性
保证TCP的流控特性
AdvertisedWindow = MaxRcvBuffer - (LastByteRcvd - LastByteRead)
EffectiveWindow = AdvertisedWindow - (LastByteSent - LastByteAcked)
1.面向非连接
2.不维护连接状态,支持同时向多个客户端传输相同的消息
3.数据包报头只有8个字节,额外开销较小
4.吞吐量只受限于数据生成速率、传输速率以及机器性能
5.尽最大努力交付,不保证可靠交付,不需要维持复杂的连接状态表
6.面向报文,不对应用程序提交的报文信息进行拆分或者合并
面向连接VS无连接
可靠性VS不可靠
有序性VS不具备有序性
速度比较慢(创建连接,保证消息的可靠性、有序性)VS速度快
重量级(元数据的头部大小20个字节)VS轻量级(8个字节)
支持客户/服务器模式
简单快速
灵活
无连接(限制每次连接只出一个请求)
无状态(对于事务处理能力没有记忆)
1.客户端连接到WEB服务器
2.发送HTTP请求
3.服务器接受请求并返回HTTP响应
4.释放连接TCP连接
5.客户端浏览器解析HTML内容
会基于URL逐层查询DNS服务器缓存,解析URL中的域名所对应的IP地址,DNS缓存从近到远:浏览器缓存-->系统缓存-->路由器缓存-->IPS服务器缓存、域名服务器缓存,从哪个缓存中查询出后直接返回。
1.DNS解析
2.TCP连接
3.发送HTTP请求
4.服务器处理请求并返回HTTP报文
5.浏览器解析渲染页面
6.连接结束
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
不足之处,可以关注私信沟通,期待技术交流!