一、get post请求的区别
http网络请求分成两块,head和body
GET 和 POST 是 HTTP 协议中两种常用的请求方法,它们在功能定位、使用场景以及工作方式上有明显的区别:
1. **目的与语义**:
- **GET**:用于请求访问已经被URI(统一资源标识符)识别的资源,即从服务器获取资源。它主要是用来获取信息,不改变服务器上的资源状态。
- **POST**:用于向指定资源提交数据以请求服务器进行处理(例如提交表单或者上传文件),可能造成对服务器上资源的修改。POST 方法常用于创建或更新资源。
2. **参数传递**:
- **GET**:参数附加在URL之后,以"?key=value&key2=value2"的形式传递,会在浏览器地址栏可见,且会被浏览器和服务器记录在访问历史和日志中。
- **POST**:参数放置在请求体(Request Body)中,不会显示在URL中,内容不可见,适合传递敏感信息。
3. **数据大小**:
- **GET**:由于URL长度有限制,一般浏览器对URL长度的限制大约为2048个字符,不适合大量数据的传输。
- **POST**:理论上数据量没有限制,可以在请求体中传输较大的数据。
4. **安全性**:
- **GET**:安全性较低,因为所有参数都包含在URL中,可能会泄露敏感信息,并且容易被第三方如代理服务器缓存。
- **POST**:相对安全,因为参数不会显示在URL中,且默认情况下不应该被中间服务器缓存。
5. **缓存**:
- **GET**:具有缓存性,响应可被缓存。
- **POST**:通常不会被缓存,但是可以通过特定的HTTP头部来实现缓存。
6. **幂等性**:
- **GET**:幂等的,多次执行相同的GET请求应当返回相同的结果(除非资源本身已被其他请求改变)。
- **POST**:非幂等的,执行同样的POST请求多次可能会产生不同的效果(例如每次都会创建一个新的资源)。
7. **书签/历史记录**:
- **GET**:可以被浏览器收藏为书签,便于重复访问。
- **POST**:由于包含了用户提交的数据,不能直接作为书签使用。
8. **TCP数据包**:
- GET 请求通常在一个TCP数据包中完成,因为URL长度有限制。
- POST 请求通常至少需要两个TCP数据包,先发送头信息再发送请求体。
根据这些特点,GET主要用于简单、安全、无副作用的查询操作,而POST则适用于复杂数据提交、资源创建或更新等场景。
二、NSURLSessionDataTask 对象发送请求 调用resume方法背后http传输过程
`NSURLSessionDataTask`是苹果在iOS和Mac OS X中提供的网络编程接口`NSURLSession`的一个具体任务类型,主要用于发起HTTP(S)请求并获取数据。当你创建并配置好一个`NSURLSessionDataTask`对象后,调用其`resume`方法是为了启动该网络请求任务。
- **调用resume方法的背后过程:**
当你调用`resume`方法时,系统会开始执行以下步骤:
1. **建立连接**:NSURLSession底层会利用系统级的网络栈,根据你设置的URL、请求头、请求体等信息,尝试建立到服务器的TCP连接。
2. **发送请求**:一旦连接建立成功,就会按照HTTP协议将封装好的请求数据发送给服务器。
3. **接收响应**:服务器接收到请求后,会返回响应数据,NSURLSession会解析这个HTTP响应,包括状态码、响应头以及响应体等信息。
4. **数据下载**:对于GET请求,响应体可能就是你要的数据;对于POST等带有数据提交的请求,响应体可能是服务器处理后的结果。这些数据将会按照你在创建`NSURLSessionDataTask`时设定的方式(如委托方法、闭包回调等)逐步下载并传递给你的应用代码。
5. **错误处理**:如果在网络请求过程中出现任何错误,比如连接失败、超时、服务器返回错误状态码等,NSURLSession也会通过相应的错误处理机制通知你的应用。
总之,`resume`方法实际上启动了整个网络请求和响应处理的过程,让NSURLSession开始执行你定义的任务,并最终将请求结果或错误信息反馈给你。
三、TCP数据分段传输
TCP 100%可靠传输,为了适配数据链路层中MTU<1500字节,必须在传输层进行最大分段算法分段。进行传输 ip+tcp+data+id1 .....
TCP(Transmission Control Protocol)数据分段传输是TCP协议为了适应网络层(IP层)的传输特性,确保数据可靠性而采取的一种机制。TCP在传输数据前,会将从应用层接收的大量数据流分成若干个较小的数据块,每个数据块称为一个TCP段(Segment)。TCP段内包含TCP头部和有效载荷(payload),其中头部包含诸如源端口号、目标端口号、序列号、确认号、窗口大小等控制信息,用于实现TCP的流量控制、拥塞控制、顺序控制和错误恢复等功能。
以下是TCP数据分段传输的关键要点:
1. **分段原因**:
- MTU(Maximum Transmission Unit)限制:网络链路层(如以太网)对传输的数据帧有最大尺寸限制,称为MTU。如果TCP数据段不进行分段,当其整体长度超出某个中间节点的MTU时,网络层的IP协议就需要对其进行分片(Fragmentation),这增加了传输的复杂性和潜在的风险。
- 可靠传输保障:TCP通过序列号和确认应答机制保证数据的有序和无差错传输,每个TCP段都有独立的序列号,即使在网络中单独传输也能被正确地重新组装。
2. **分段过程**:
- MSS(Maximum Segment Size):TCP在建立连接时,通过TCP选项字段协商确定双方的最大报文段大小(MSS),这是TCP段的有效载荷上限,不包括头部。
- 数据分段:当应用层数据需要发送时,TCP层根据MSS将其分割成适当大小的段,并对每个段添加TCP头部信息,包括必要的控制字段。
- 编号和排序:每个TCP段都会被赋予一个唯一的序列号,接收方可以根据序列号将多个段按正确的顺序重新组合成原始数据流。
3. **重传和确认**:
- 如果某个TCP段在网络中丢失,接收方无法确认对应的序列号,发送方会通过超时重传机制重新发送该段。
- 快速重传算法:若接收方连续收到三个或更多重复的ACK,会触发快速重传,即不必等待重传定时器超时就立即重传未被确认的段。
通过这样的分段和确认机制,TCP能够在复杂的网络环境下实现可靠的数据传输,确保数据的完整性、顺序性和可靠性。
四、UDP数据在Ip层分片传输
主要的原因是数据在数据链路层中MTU<1500字节,要想在数据链路层可以传输必须在IP层分城好几组数据进行传输。f1+ip+udp+data+id1+f1
UDP(User Datagram Protocol)数据在IP(Internet Protocol)层进行分片传输的过程是这样的:
当应用层通过UDP发送的数据报文过大,以至于超过了路径上的最小MTU(Maximum Transmission Unit,最大传输单元)时,IP层必须对这个大的数据报文进行分片以便在物理网络上进行传输。这个过程大致如下:
1. **UDP封装数据**:
应用层的数据首先被封装进UDP报文中,UDP报头包含了源端口、目的端口以及UDP数据报的总长度(包括UDP头部和数据部分)。
2. **IP层检查数据报大小**:
UDP报文随后被送到IP层进行封装,IP层在准备发送数据之前会检查整个IP报文(包括IP头部和UDP报文)的总长度是否超过所经过网络路径的MTU。如果是,就需要进行分片。
3. **IP分片**:
如果IP数据报太大,IP层会对数据报文进行分片,每个分片成为一个独立的IP数据报,每个分片都有自己的IP头部,并且除了最后一个分片外,其余分片都会被标记为“还有更多分片”(More Fragments, MF)标志位。每个分片还包含原始数据报的标识符(Identification)、分片偏移量(Fragment Offset)等信息,这些信息用于在接收端重组数据。
4. **传输分片**:
每个IP分片独立地在互联网上传输,它们可能会沿不同的路径到达接收端,而且各个分片并不保证按序到达。
5. **接收端重组**:
接收端的IP层收到每个分片后,根据IP头部中的标识符和分片偏移量来判断这些分片属于同一个原始IP数据报,并且负责重新组装这些分片恢复出完整的UDP报文。
6. **交付给UDP层**:
当所有的IP分片都被正确接收并且重组完成后,IP层会将完整重组的UDP数据报传递给UDP层,然后再由UDP层根据源端口和目的端口将数据交给对应的应用程序。
需要注意的是,UDP本身并不关心数据是否被分片,也不负责数据的重传。如果某一个IP分片在网络中丢失,导致数据无法正确重组,那么整个UDP数据报就会丢失,UDP也不会像TCP那样进行重传。这就是为什么UDP被认为是不可靠的传输协议之一。