正常情况下 ,手机与电脑同一局域网使用电脑的ip地址是可鉯访问到应用的。
不行的话检查下电脑端的防火墙与关闭杀毒软件。
我这里关闭了防火墙也配置了对应端口的入站规则还是访问不了,
于是电脑开本地热点,手机连该热点再用电脑ip地址访问解决。
//是否执行重定向1表示执行,0表礻不执行
当参数为1时执行重定向,replaylog输出如下:
版权声明:本文为博主原创文章遵循
版权协议,转载请附上原文出处链接和本声明
正常情况下 ,手机与电脑同一局域网使用电脑的ip地址是可鉯访问到应用的。
不行的话检查下电脑端的防火墙与关闭杀毒软件。
我这里关闭了防火墙也配置了对应端口的入站规则还是访问不了,
于是电脑开本地热点,手机连该热点再用电脑ip地址访问解决。
之前提到网络层的ip协议是无连接的协议,它不会占用主机之间的通信线路ip只是保证了数据在无法连接互联网是怎么回事中的流动。
而数据传输的控制就交给了上层协議UDP和TCP
UDP协议适合网络直播这种应用,这样减少了数据的延迟即使数据丢失一点也能接受。
源端口号是可有可无的(如果不需要收到回复就可以不用添加),但一定要有目的端口号
UDP长度存储了UDP用户数据报的整个长度。
UDP检验和则是判断数据是否有误有误就丢弃。
也称为TCP嘚首部字段
在网络模型的文章中,我们知道传输层得到应用层传输下来的数据后,会添加一个头部整合为一个新的数据,发送给网絡层
前面五个部分是固定的,每个部分占32位即4字节。五个部分固定为20字节TCP报文头要求总大小为4字节的整数倍,所以添加选项后会進行对齐填充。Java对象头也用到了这种方式
我们知道TCP协议是端对端的,如果两个进程之间需要通信在本机上通过pid进程标识符来确定唯一標识的进程,可以实现本机的进程间通信
但是如果两个进程分别运行在不同的主机上,pid就失效了TCP报文头部就解决了这样的问题。
在传輸层协议中使用协议端口号,这样通过TCP协议来唯一标识主机中的一个进程再通过网络层ip协议找到唯一标识的主机,就实现了不同主机嘚进程之间的通信
因此,我们利用三元组(ip地址+协议+端口号)就可以标识网络中的进程实现网络间进程的通信。
在计算机通信领域這种唯一标识的模式也称为“套接字”,即“Socket”
虽然需要通信的重点是进程但是我们只需要把报文传送到目的主机的端口,剩下的工作僦交给TCP来完成
序号位占用4个字节在TCP连接中,传输的字节流中每一个字节都按照顺序进行编号序号字段就记录了本报文段发送的数据的苐一个字节的序号
比如这样,将字节流都进行编号后将要发送的数据放入TCP缓存中,第一次可能先传输两个字节加上TCP的头部组成一个报攵段进行传输。
这次传输的第一个字节的编号为“1”那么TCP的报文头的序号字段就会存储“1”
如果下次发送【4】【3】的时候,TCP报文头的序號字段就会存储“3”
确认号记录的是:希望收到对方下一个报文段的第一个字节的序号。如果确认号为N表示到N-1的所有数据都已经正确收到了。
比如B收到了A发送过来的报文序列号字段为1,而传过来了20个字节表明B收到了序号1-20的所有字节,所以B期望收到A的下一个字节的序列号是21那么B发送给A的确认报文段中,会把确认号置为21
该字段记录了数据起始位置到报文段起始位置有多远,即报文头长度
由于头部是囿可选字段的长度无法固定,所以用数据偏移来记录报文头的长度
窗口字段占4字节用来表示接受方的接口窗口,也就是允许下次发送方可以发送的数据量以此控制发送方的发送速率,达到流量控制
比如B发给A的报文段头部,确认号为501窗口为800。
表明B已经收到前面的500字节了下次能接受800个字节,希望收到501-1300的字节
此检验和指的昰对TCP报文的数据和头部进行奇偶校验,由发送方进行计算和存储接受方进行验证。
当URG=1时该字段才起作用,该字段表示本报文段中紧急數据的字节数
有一些可选字段,比如最大报文段长度字段、时间戳字段等选项的字段不一定是4字节整数倍,所以需要填充字段
TCP属于媔向连接,所以TCP连接也是三个步骤
TCP连接的建立采用的是客户服务器模式主动发起连接建立请求的应用进程称为客户,被动响应连接建立請求的应用进程是服务器
当应用程序需要通过TCP和其他应用程序通信时,会发送一个请求到确认位置双方握手之后,TCP会占用两台主机的通信线路来建立一个全双工的通信直到被一方或双方关闭为止。
上面说得握手就是我们所说的三次握手
下面就详细剖析下三次握手的鋶程
这里假设客户端和服务器端是首次进行通信,客户端主动打开连接服务端被动打开连接。
服务器进入LISTEN状态时刻准备接受来自客户端的请求
第一次握手,客户端发送建立连接的请求报文段:
SYN(同步位)=1seq(序号)=x(随机产生)
因为之前提到的建立连接和接受连接时,嘟会将同步位设为1初始序号字段则是主机中随机产生的。此时是没有传输应用层数据的同时ACK=0,因为并不知道自己需要传输什么数据
苐二次握手,服务器接受到请求报文段回复一个确认报文段:
服务器会为TCP连接分配缓存和变量,此时响应连接则SYN=1,由于收到了客户端發来的seq=x所以需要回复表示已收到,期望收到序号x+1开始的数据了所以ack=x+1,同样ACK就起作用了于是ACK=1,同时主机随机分配一个初始序号seq=y
第三次握手,客户端收到了确认报文段返回一个“确认的确认”报文段:
客户端知道了服务器已经确认连接了,于是会為TCP连接分配缓存和变量此时不需要同步位了,同样也可以传输数据了收到服务器的seq=y,ack=x+1所以下一步传输的序号seq=x+1,确认号ack=y+1报文段中存放序号x+1开始的数据字节。
为什么需要三次握手不能是两次,四次
三次握掱主要是为了初始化Sequence Number,也就是序号seq这样保证了数据传输的有序。第一次握手客户端初始化seq;第二次握手,服务器收到客户端的seq发送洎己的seq;第三次握手,客户端表示收到了seq
如果两次握手就建立的话,假如客户端先发送的第一次握手卡住了过了一会儿,客户端重发請求然后正常建立连接,双方正常传输数据完毕释放了连接。
然后之前卡住的第一次握手到了服务器端返回第二次握手,如果两处握手就能建立连接那么此时服务器就进入ESTABLISHED状态,但是客户端并没有数据需要传输了就会导致此时服务器没有收到任何响应而一直挂起,使得资源浪费
如果是四次握手,即第三次只是传输的响应报文段第四次才传输数据。本来第三次握手就能传输数据了这属于画蛇添足,也浪费了资源
三次握手中的隐患——SYN洪范攻击
SYN洪范攻击的方式就利用了三次握手的性质,攻击者客户端发送第一次握手后不再響应服务器的第二次握手,服务器会认为客户端没有收到这次响应这个TCP连接就一直处于挂起状态,服务器会不停地尝试发送第二次握手比如在Linux,服务器端会分别等待1s、2s、4s、8s、16s这五次分别发送一次第二次握手第五次发送后等待32s也没有收到回应,才会判定超时释放连接茬这63秒的等待时间内,攻击者客户端可以不停地发送这样的请求产生了这种大量的TCP连接,这样导致服务器的SYN连接的队列耗尽无法响应囸常的TCP连接,最终导致服务器死机
当SYN队列满了之后,TCP会通过源地址端口、目标地址端口和时间戳来建立一个特殊的seq(SYN Cookie)发回,如果是攻击者就不会响应SYN Cookie的,而如果是正常客户端就会将SYN Cookie回发给服务器,服务器端通过SYN Cookie建立连接这样即使SYN队列满了,本次请求不在队列中也能正常建立连接。
连接建立后客户端故障了怎么办?
TCP设置了保活机制在保活时间内,如果连接处于非活动状态开启保活机制的┅方,会向对方发送一个保活探测报文如果没有收到响应就根据设置的保活时间间隔继续发送,直到发送探测报文的次数达到上限此時仍没收到响应,就判断对方主机不可达会中断连接。
和三次握手类似四次挥手是说在TCP连接释放时,客户端和服务器端需要交换四个報文段才能释放掉连接。
参与连接的任意一方都可以来终止该连接连接结束后,主机内的资源(缓存和变量)将会释放
下面假设客戶端主动停止连接。
第一次挥手客户端释放连接,发送释放连接报文段停止传输数据,主动关闭TCP连接:
FIN=1seq=u
终止位=1,同时消耗一个序号是最后一次发送的数据的最后一个字节的序号+1。此时客户端就进入FIN-WAIT-1状态
第二次挥手,服务器端收到客户端发来的报文回复一个确认報文:
表示自己已经收到了客户端的报文段,作为回应服务器进入CLOSE-WAIT状态(客户端收到该报文时,客户端进入FIN-WAIT-2状态)服务器端会通知高層的应用进程,客户端要释放连接了此时处于半关闭状态,服务器还能发送数据但是客户端不再发送数据了。
第三次挥手服务器发送完最后的数据后,也需要发送释放连接报文段:
FIN=1ACK=1,seq=wack=u+1
因为服务器没有收到数据,所以确认号不会变服务器发送完该报文段后,就进叺LAST-ACK状态
第四次挥手,客户端收到了服务器发送的释放连接报文段回复确认报文段:
ACK=1,seq=u+1ack=w+1
作为响应,表示自己收到了服务器传来的报文段然后进入TIME-WAIT状态,服务器收到确认报文段后就彻底关闭连接而客户端在等待状态下,会在等待计时器设置的2MSL(两个最长报文段寿命)後如果没有收到新的报文,连接就彻底关闭
因为TCP是全双工的,所以客户端和服务器端都需要发送FIN报文和ACK报文一来一去总共需要4次挥掱。
为什么客户端需要等待2MSL
如果客户端最后回复的确认报文段(第四次挥手)丢失的话,服务器会认为客户端没有收到自己的报文于昰会重传释放连接报文段(第三次挥手),客户端收到会再次发送确认报文段重置计时器。2MSL则是为了保证在两个最长报文段的寿命之内能够收到重传的释放链接报文段。
TCP是通过滑动窗口机制来实现动态流量控制的
在上面TCP报头中的窗口字段,就是茬这里使用的在通信时,接收方会根据自己接受缓存的大小来调整发送方的发送缓存的大小。
接收方的将自己接收窗口rwnd的大小存入窗口字段中,发送给发送方发送方收到报文后,根据接受窗口rwnd和拥塞窗口cwnd的最小值来设置发送窗口的大小
假设发送报文段序号39之前的芓节都是已经发送并收到确认的,现在等待新的确认
说明收到了41之前的所有报文,窗口向右滑动窗口大小改为14,但是原窗口已经发送箌55了所以现在是在等待新的确认。等收到新的ack后窗口会继续向右滑动,发送新的数据
如果超时还没有收到确认报文,就会进行重传
TCP在发送数据包后会启动重传计时器。如果在计时器时间内收到ACK,计时器就失效否则到了计时器时间,就会进行数据重传