网络编程TCP和UDP相关


TCP服务:可靠的 面向连接的流式服务  进行一对一的连接比较方便(数据没有边界,多次发送的数据可以被对方一次性接收)

必须先建立连接 ,在发送数据  依靠三次握手建立连接

利用滑动窗口进行流量的控制

采用发送应答机制,发送端发送每个TCP数据报服务必须收到接收端的应答,才认为此数据报发送成功
TCP报文最终以IP数据报发送,IP数据报到达接收端有可能乱序,重复,所以TCP协议对接收到的IP报文重排,整理,再交付应用层。
TCP协议使用超时重传、数确认等方式确保数据被正确的发送至目的端    TCP服务时可靠的
TCP和UDP可以同时使用一个端口
TCP服务是基于流式套接字的,基于流的套接字没有数据长度的限制,源源不断的从通信的一端流入另外一端,发送端可以逐个字节的向数据流中写入数据,接收端也可以逐个字节的将他们读出
 

网络编程TCP和UDP相关网络编程TCP和UDP相关

网络编程TCP和UDP相关网络编程TCP和UDP相关

nestat查看网络链接状态


SYN:客户端请求建立链接服务端
ACK/SYN:服务器端确认建立链接并且回复SYN进行确认
ACK:客户端给服务器端发送数据


建立链接:三次握手
断开链接:四次挥手

如果是两次握手:
1、如果最后的一个ACK,则服务器会不断超时重传ACK.SYN
2、会浪费服务器的资源,SYN溢出攻击,因为网络环境  客户端的SYN会被重传多次

四次挥手:
第一个FIN是关闭主动方到被动方的传输通道
第二个FIN是关闭被动方到主动方的传输通道
也有可能是三次挥手


CLOSE   和TIME_WAITE的区别
被动断开方    主动断开方

TIME_WAIT状态存在的原因有两点:

可靠的终止TCP连接

保证让迟来的TCP报文有足够的时间被识别并丢弃

网络编程TCP和UDP相关


UDP服务:
不可靠  无连接和基于数据报的UDP服务    可以进行一对多的连接   
不可靠表示UDP协议无法保证数据从发送端到正确的传输到目的段端 
对于数据只进行一次读取,若一次没读完 ,下次不进行读取,进行下一个数据的读取(每个UDP数据报都有一个长度,接收端必须以该长度的最小单位将其所有内容进行一次性的读取,否则数据将被截断

网络编程TCP和UDP相关

网络编程TCP和UDP相关

 

先建立连接   才能收发数据
connect()   发起连接(开始三次握手)
依靠三次握手建立连接
listen() 创建监听队列
Linux-> 已完成三次握手队列的大小


TCP与DUP的传包区别:一个不封装(TCP)一个封装(UDP)
TCP报文段和UDP数据报通过其头部的16位端口号字段来区分上层应用程序,DNS协议对应的端口号是53,HTTP 协议对应的端口号是80

粘包的解决方式: 
加标记     将字符分隔开,便于辨认   (设置数据起始和结束标记)

send/recv/send 交替执行       将粘包分隔开 ,不用解析  

 

发送端判断拥塞的依据有如下两个:

传输超时,或者说TCP重传定时器溢出

接收到重复的确认报文段

connect()后建立连接,发送第一个SYN,connect返回成功三次,握手完成。

listen()未完成三次握手,已完成握手队列      n代表已完成三次握手队列的长度

如何防止connect长久阻塞???  为套接字描述符设置起止时间

三次握手哪个阶段容易出现攻击???

比较典型的是SYN泛洪攻击,或叫SYN移除攻击

SYN溢出攻击,即出现在第二阶段,如果客户机伪造出大量第一次的SYN同步报文,服务端就会依次耗掉很多资源来保护客户端的信息,并进行确认,实际确认是会失败的,但失败是需要一定时间的,因为服务端会连续多次,进行第二次握手确认后才认定失败。那么短时间内有大量的SYN同步报文涌向服务器,服务器资源可能被耗尽,就可能导致正常的客户端得不到响应而失败。

什么情况下用TCP,什么情况下用UDP:

根据实时性选择UDP,根据可靠性选择TCP

RST  复位报文