TCP三次握手和四次挥手
TCP头部字段 握手和挥手三次握手
为什么是三次握手?形象的讲,两个人打电话,张三说:“喂?你能听到吗?”。李四回答:“我能听到,你能听到么?”。张三再说:“我能听到”。这三次对话,就叫三次握手。
三次握手的原因是,第一次握手确定了客户端有发送能力。也就是确定张三不是哑巴。第二次握手确定了服务端的接受能力和发送能力。也就是确定了李四不是聋子,且也不是哑巴。第三次握手确定了客户端的接受能力。类比就是确定了张三不是聋子。
确切的说,客户端先发送一个SYN=1的请求,表示请求连接,再带一个32位的序号J。客户端收到请求连接后,返回的应答ack=J+1 表示接收请求正常,希望收到的下一个数据为J+1,同时发送SYN,以及自己的32位序号K,表示自己请求连接。同样客户端收到服务端的请求连接后,返回ack=K+1,表示接收请求正常,希望收到的下一个数据为K+1。
四次挥手
挥手可以由任一一方发起,客户端发起停止传输请求(一次),服务端返回确认(二次)。此时就关闭了客户端的发送功能。但是这个时候有可能服务端还在发送数据,所以服务端需要等一下。等服务端也需要停止的时候,服务端发起停止传输请求(三次)。客户端返回确认(四次)。
确切的说,客户端发送一个FIN=1的请求,以及32位序号M,表示希望结束发送。服务端返回一个ack=M+1表示 ok 同意你结束发送。但这时候服务端还没决定要结束发送。
当服务端也决定要结束发送的时候,发送一个FIN请求给客户端,以及自己的序号N,客户端回一个ack=N+1表示统一结束发送。之后,客户端再等待2TIME_WAIT时间后,关闭程序。
之所以要等待2TIME_WAIT, 是因为有可能最后一次客户端的同意请求未送达到服务端,若未送达到服务端,超时(一个TIME_WAIT)以后,服务端应该会重复发送结束请求过来,既然在2TIME_WAIT的时间里,客户端都还没收到服务端的重发请求,那说明没丢包。此时才算四次挥手完成。
TCP的可靠性
TCP的上层协议IP协议本身是不可靠的,但是TCP通过自身的一些设置,成为了互联网中最广泛的一种可靠传输协议。
一个协议不可靠,主要在于
1、丢包(传丢了)
2、冗余(传重复了)
3、异常(数据被干扰突变了)
4、先后错误 (后发的先到了)
TCP协议中,通过校验码可以判断异常问题;通过序号可以判断丢包、冗余、先后错误问题。
若丢包了,发送端会超时重传;若其他异常,接收端可以主动请求发送端重新传数据,这称为快速重传。
TCP的流量控制
A机器发送数据给B数据,速度的上线不但取决于A机器能发多快,还要取决B机器能接收多快。所以B机器在应答TCP请求时,不止会带上下一次希望收到的数据,还会带上自己目前窗口的大小。如图:
流量控制
TCP的拥塞控制
拥塞控制HTTP
常用的HTTP请求方法
- GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器。
- POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
- PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
- HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
- DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
- OPTIONS:查询相应URI支持的HTTP方法。
网友评论