(IP地址)唯一标示主机+(TCP协议+端口号)唯一标示主机中的进程,可以唯一表示网络中的一个进程。网络进程就可以通过Socket进行网络通信。
“握手”是为了建立全双工连接,TCP(提供可靠的连接服务)三次握手:
1.客户端与服务器端默认为close状态,直到有一方发起主动连接请求。
2.服务器先创建传输控制块PCD,时刻准备接收连接请求,状态变为listen。
3.客户端创建PCD,向服务器发起请求连接报文(SYN=1、seq=x),客户端进入SYN-SENT状态。第一次握手,不可携带数据。
4.服务器收到请求报文,如果同意连接会发出确认报文(SYN=1,ACK=1,seq=y,ack=x+1)。服务器进入SYN-RCVD同步收到状态。第二次握手。不可携带数据。
5.客户端收到响应报文后,再次向服务器发出确认报文(ACK=1,seq=x+1,ack=y+1),客户端进入EASTB-LISHED状态。第三次握手,可以携带数据。
6.服务器收到确认请求报文,进入EASTB-LISHED状态,完成三次握手。
为什么要三次握手才能建立连接?
为了通知对方彼此的Sequence Number初始值,SYN会作为数据通信序号,保证应用层接受的数据不会乱序,TCP以该序号进行排序。
首次握手的隐患?
SYN超时问题,Server收到Client的SYN,回复SYN-ACK的时候(Client停止访问)Server未收到ACK确认,Server会不断重试直至超时(63s)才断开连接,根据此特性可以对Server发起占用资源的攻击。 可以用SYN Cookies解决。
建立连接,Client出现故障?
保活机制,向对方发送探测报文,尝试次数达到保活探测数,还未收到响应则中断连接。
TCP Flags:
1.ACK:确认序号标志2.URG:3.PSH4.RST5.SYN:同步序号,用于建立连接过程6.FIN:finish标志,用于释放连接“挥手”,终止连接。
1.Server与Client都处于ESTAB-LISHEN状态,Client连接发起连接释放报文(也可以停止发送数据)(FIN=1,seq=u),Client进入FIN-WAIT-1终止等待状态。第一次挥手。
2.Server收到FIN报文后,发起确认报文(ACK=1,seq=v,ack=u+1),Server进入CLOSE-WAIT关闭等待状态。第二次挥手。Client收到确认报文后,进入FIN-WAIT-2终止等待状态。第二次挥手和第三次挥手之间还可以进行数据传送。
3.Server发送连接释放报文(FIN=1,ACK=1,seq=w,ack=u+1),用来关闭双方数据传送,Server进入LAST-ACK最终确认状态。第三次挥手。
4.Client发送确认释放报文(ACK=1,seq=u+1,ack=w+1),进入TIME-WAIT时间等待状态。TCP还未释放,必须经过2MSL时间后才真正释放,进入CLOSED状态。第四次挥手。
5.Server收到确认,进入CLOSED状态。
为何有TIME-WAIT状态?
1.确保有足够的时间让对方收到ACK包。2.避免新旧连接混淆。为何需要四次挥手?
因为全双工,双方都需要FIN报文和ACK报文。
Server出现大量CLOSE_WSIT状态原因?
1.检查代码,特别是释放资源的代码。2.检查配置,特别是处理请求的线程配置。滑动窗口可以依据某些策略动态调整,可以使用TCP对滑动窗口的操纵:
1.流量控制2.乱序重排TCP的传输可靠性?
1.接收窗口的滑动机制。(发送窗口只有收到本段发送字节的ACK确认,才会移动发送窗口的左边界,接受窗口只有在前面接收段都确认的情况下,才会移动左边界)。2.确认重传机制。HTTP协议基于请求与响应模式的、无状态的应用层协议。 主要特点:
1.支持客户\服务器模式。2.简单快速:只需请求方法与路径,客户端就可向服务器请求数据。3.灵活:传输任意类型数据。4.无连接:每次连接只处理一个请求,就关闭。(keep-alive可能会有长连接)5.无状态HTTP状态码
GET请求和POST请求的区别?
1.Http报文层面:GET将请求信息放在URL以❓隔开;POST放在报文体中,需要解析才能获取请求信息,安全性较高一点。2.数据库层面:GET符合幂等性(对数据库的一次操作和多次操作获得的结果是一致的)和安全性(对数据库的操作没有改变数据库中的数据),POST都不符合。3.其他层面:GET可以被缓存、被存储,而POST不行。绝大部分的GET请求会被CDN缓存,减少web服务器的负担。
session 和cookies的区别?
1.Cookie数据存放在客户端,Session数据存放在服务器。2.Session相对于Cookie更安全。3.若考虑减轻服务器负担,应当使用Cookie。HTTPS之与HTTP上加入了SSL 和 TLS,有保护交换数据隐私、完整性和网站服务器身份认证的功能。
SSL(Securoty Sockets Layer 安全套接层):
1.为网络通信提供安全及数据完整性的一种安全协议。2.位于TCP和应用层之间,是操作系统对外的API。采用身份验证和数据加密保证网络通信的安全和数据的完整性。Socket是对TCP/IP协议的抽象,是操作系统对外(网络程序)开放的接口 参考网址 。
1.服务器端需要创建socket,并绑定bind 65000的端口。并使用while死循环,监听端口有无响应,有响应后执行相关业务逻辑。
ServerSocket ss = new ServerSocket(port:65000) while(true){ Socket socket = ss.accpet(); /* 执行相关业务 */ }2.客户端创建socket,并指定连接的服务器ip和端口号port 65000,获取输入和输出流,执行相关业务逻辑,最后关闭输入输出流和socket连接。
Socket socket = new Socket(host:"127.0.0.1",port:65000); //获取输入输出流 OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); /* 执行业务 */ //关闭输入输出流 is.close() os.close() //关闭socket连接 socket.close()最后修改于时间:2020年10月15日
