大于4096 临时端口
由于TCP是面向连接的,所以可以连接多个客户端支持并发。
粘包(流式服务的特点):TCP流式服务,recv从接收缓冲一次读取数据,而send时多次写入发送缓冲区
不是所有的粘包都会出现问题。
比如 :
1.发1000个数据,不论对方如何接收,一次接收,10个10个接收,并不影响。
2.但是比如发送 一个长方体的长2宽3高4,计算其长宽高,但是接收方一次收取234。体积就无法返回。
【粘包问题】如何解决:
- 第一方案
send(2)一次
recv (2)一次
send(3)一次
recv (3)一次
send(4)
recv (4) - 解析包:【2】【3】【4】,将最后的收到的数据包进行解析。
- 对每个报文进行起始标记/结束标记
2; 3; 4; - 三次握手状态
CLOSED
: 没有任何连接
SYN
:发起一个链接
RST
:重新发起连接``
LISTEN
;侦听状态,等待TCP连接
SYN_SENT
: 已发送请求连接等待匹配链接(发送能力正常)
SYN_RCVD
:接收和发送一个连接后等待匹配连接(发送和接收能力正常) - 四次挥手的状态
ESTABLISHED
连接状态
FIN_WAIT1
:等待TCP中断请求
CLOSE_WAIT:等待从本地用户发来的 连接中断请求 FIN_WAIT2
: 等待TCP中断请求
LAST_ACK
:最后确认
TIME_WAIT
: 等待2MSL(两个报文时间)后关闭连接
MSL
:一个报文在网络中存活的最长时间
为什么要有TIME_WAIT?
- 保证客户端发送的最后一个ACK报文段能够到达服务端。(可靠的终止TCP连接)
如果如果客户端发送的ACK,没有被(处于LAST_ACK
状态的)服务器端在2MSL没有收到客户端的最后ACK,就会重新发送FIN ACK,等待客户端收到并且回复确认序列ACK,服务器端收到ACK报文,才会正常关闭,处于CLOSED状态。
如果没有这2MSL,(FIN_WAIT2)客户端收到 (处于LAST_ACK状态的)服务器发送的FIN+ACK,后回复ACK,立即关闭连接,如果该ACK报文,没有被服务器收到,那么服务器就无法进入正常的CLOSED状态。 - 防止“已失效的连接请求报文段”出现在本连接中。(保证迟来的TCP报文段有足够的时间识别并丢弃 )
等待2MSL,是为了让网络中产生的所有报文消失。否则,那些由于客户端和服务器关闭,滞留在网络中的报文,很可能会出现下一次新连接中。(且该链接绑定的端口和服务器的端口一样,但是不能让其被下个连接接收)
同发FIN 同时关闭
-
当AB在局域网内,a ,b两台主机建立连接。拔掉网线。在插上网线,会是什么状态。
服务器端就会关闭,重新打开服务器也是处于CLOSED状态,客户端没有收到任何关闭的信息,但是客户端以为已经完成三次握手,直到一发数据,发现数据发不了(序号值不匹配)。需要重新发起连接。(RST
重新连接)
可靠性:
tcp:确认应答:发送方每发送一次数据,接收方都会回复ack
超时重传(没有收到对方的确认ack,就会重新发送报文)
乱序重排(去重,序号相同的报文会丢弃)(报文发送的早,不一定先到达,因此会给每个报文都带有一个序号(随机产生),到达后,会重新排序)
滑动窗口(流量控制,控制开关):每次发送数据,都是一段数据。(发送数据的大小 由窗口决定)
使用TCPdump
观察TCP连接的建立和关闭(抓包过程)
抓包命令:(管理员身份)
带S,会显示ACK的值而不是1。 -
三次握手:
-
客户端发送"hello"
服务器回复"ok"
实际上客户端发送数据hello,服务器会回复ack
服务器回复ok,客户端回复ack -
四次挥手
-
思考问题:
-
接收端填充的接收通过窗口为0,发送端接下来怎么处理?
滑动窗口的大小不能超过,接收一次允许传递的最大数据量 -
什么叫糊涂窗口综合征?
定义:当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之;
因为糊涂窗口综合征的原因使大量小数据在网络上传输,而且由于TCP是一种可靠的传输协议,每个数据包都要用一个ACK来确认(没用使用延迟确认情况下如此),所以浪费一些时间,而且丢包和失序的可能性也增加了。
解决方案:发送端:a.全长的报文段可以发送
b.数据段长度>=接收端通告过的最大窗口值的一半的,可以发送
c.满足一下任一条件的都可以发送:
(i)某一ACK不是目前期盼的(即没有未经确认的在传数据)。
(ii)该连接禁用Nagle算法。
接收端:在窗口可增至一个全长的报文段(即接收端的MSS)或缓冲空间一半之前,不能·通告比当前窗口(可能是0)更大的窗口值。 -
在 TCP 的实现中广泛使用的 Nagle 算法是什么?
-
什么是抓包?
就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。
抓包的目的就是为了获取到想要的原始数据,拿到数据以后,我们就可以做以下一些事情:
-
分析数据传输协议。
定位网络协议的问题。 从数据包中获取想要的信息。 将截取到的数据包进行修改,伪造,重发。
-
ping
查看物理网络是否连通。
《unix网络编程》第四章和第五章死锁