UNIX网络编程总结二
绝大多数客户-服务程序使用TCP和UDP,这两个协议转而使用IP。UDP是一种简单的,不可靠的数据报协议,TCP是一种精致的可靠的字节流协议。
在TCP/IP协议族中:
mrouted:IGMP→IPv4
ping:ICMP→IPv4/IPv6
Traceout:ICMP→IPv4/IPv6,IPv4/IPv6
Application:TCP/UDP→IPv4/IPv6
UDP:
UDP是一个简单的传输层协议,应用进程写数据报到UDP套接口,由它封装成IP数据报,然后发送到目的地,但是UDP不保证数据报最终可达目的地。我们也称UDP提供无连接的服务,因为UDP客户与服务不必存在长期的关系。
TCP:
1、TCP提供客户与服务器的链接。
2、TCP提供可靠性。
3、TCP通过给每一个所发送的字节关联一个序号进行排序。
4、TCP提供流量控制。
5、TCP是全双工的。
TCP连接三路握手:
1、服务端通过socket、bind、listen完成被动打开。
2、客户端通过connect执行主动打开,并发送一个SYN分节,他告诉服务器他将在链接中发送的数据的初始序列号,一般SYN分节不携带数据,它只含有一个IP头部,一个TCP头部和可能存在的TCP选项(一次握手)。
3、服务器确认客户的SYN分节,同时发送一个SYN分节,他含有服务器将在链接中发送的数据的初始序列号(二次握手)。
4、客户端需确认服务端的SYN(三次握手)。
TCP的SYN选项:
MSS选项:通知对方它的最大分节大小。
窗口规模选项:TCP通知双方的最大窗口大小。
时间戳选项:防止失而复得的分组造成的数据损坏,高速连接是使用。
TCP终止:
1、调用close执行主动关闭(发送FIN分节)。
2、接收FIN的一端执行被动关闭,也作为文件结束符传给应用进程。
3、接收文件接收符的应用进程执行close,它的TCP发送一个FIN。
4、原发送方收到后执行确认ACK。
TCP状态转换:
Client发送SYN分节调用主动打开,状态转为SYN_SENT;
Server接收到SYN分节,向client发送SYN分节和ACK信息,变为SYN_RCVD;
Client接收到SYN分节和ACK信息,向server发送ACK,client变为ESTABLISHED;
server接收到ACK状态转为ESTABLISHED;
--------------------------------------------------------------------------------------------------------------------
Client发送FIN发起关闭,状态转换为FIN_WAIT_1;
Client接收到ACK,状态转换为FIN_WAIT_2;
Client接收到,发出ACK,状态转换为TIME_WAIT;
TIME_WAIT持续2MSL(最长分节生命期),状态转为关闭。
--------------------------------------------------------------------------------------------------------------------
Client发送FIN发起关闭,状态转换为FIN_WAIT_1;
Client接收到server的FIN并回ACK,状态转换为CLOSING;
Client接收到server的ACK,状态转换为TIME_WAIT;
TIME_WAIT持续2MSL,状态转为关闭。
--------------------------------------------------------------------------------------------------------------------
Client发送FIN发起关闭,状态转换为FIN_WAIT_1;
Client接收到server的FIN;ACK并回ACK,状态转换为TIME_WAIT;
TIME_WAIT持续2MSL,状态转为关闭。
-----------------------------------------------------------------------------------------------------------
ESTABLISHED的server接收到FIN,并返回ACK,状态转换为CLOSE_WAIT;
Server发送FIN,状态转换为LAST_ACK;
Server接收到ACK,状态转为关闭。
TIME_WAIT存在的理由:
1、实现TCP全双工的可靠性。
若最终的ACK丢失,服务端可能重发最后的FIN,客户端可能不得不重发最终的ACK。
2、允许老的重复分节在网络中消逝。
在关闭连接后,之后又重新用相同的IP地址和端口创建连接,2MSL可以保证两个方向发送的分组被完全丢弃,保证老的分组已经在网络中消逝。
缓存区:
IPv4数据报最大为65535字节,包括IPv4头部(20字节)。
IPv6数据报最大为65575,IPv6头部占40字节,有效负载长度16位。
最大传输单元(MTU),以太网的MTU为1500,IPv4的最小MTU为68,IPv6为576字节,路径MTU在不同方向可以不同。若一个ip数据报超过最大MTU,IPv4和IPv6都会执行分片,IPv4在主机和路由器转发的数据报都会执行分片,IPv6只在主机对数据报进行分片。但若IPv4的DF位被设置,则不允许分片,但会抛错。IPv4支持的最小数据报为576字节,IPv6为1500字节。
调用write时,内核从应用进程的缓存器拷贝数据到套接口的缓存区,拷贝完成write返回,所以write完成只代表拷贝完成,不代表数据传输成功。
UDP套接口的发送缓存区仅仅是发送到该套接口的UDP数据报的大小上限。
UNIX网络编程总结二的更多相关文章
- 【UNIX网络编程(二)】基本TCP套接字编程函数
基于TCP客户/server程序的套接字函数图例如以下: 运行网络I/O.一个进程必须做的第一件事就是调用socket函数.指定期望的通信协议类型. #include <sys/socket.h ...
- UNIX网络编程---传输层:TCP、UDP、SCTP(二)
UNIX网络编程----传输层:TCP.UDP.SCTP 一.概述 本章的焦点是传输层:包括TCP.UDP.和SCTP(流控制传输协议).SCTP是一个较新的协议,最初设计用于跨因特网传输电话信令. ...
- [转载] 读《UNIX网络编程 卷1:套接字联网API》
原文: http://cstdlib.com/tech/2014/10/09/read-unix-network-programming-1/ 文章写的很清楚, 适合初学者 最近看了<UNIX网 ...
- UNIX网络编程---简介
UNIX网络编程---简介 一. 概述 a) 在编写与计算机通信的程序时,首先要确定的就是和计算机通信的协议,从高层次来确定通信由哪个程序发起以及响应在合适产生.大多数 ...
- UNIX网络编程 卷2:进程间通信
这篇是计算机类的优质预售推荐>>>><UNIX网络编程 卷2:进程间通信(第2版)> UNIX和网络专家W. Richard Stevens的传世之作 编辑推荐 两 ...
- UNIX网络编程——select函数的并发限制和 poll 函数应用举例
一.用select实现的并发服务器,能达到的并发数,受两方面限制 1.一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n来调整或者使用setrlimit函数设置, ...
- 【unix网络编程第三版】ubuntu端口占用问题
<unix网络编程>一书中的代码并不是能直接运行,有时候需要结合各方面的知识来解决,大家在这本书的时候,一定要把代码都跑通,不难你会错过很多学习的机会! 1.问题描述 本人在阅读<U ...
- 【UNIX网络编程第三版】阅读笔记(一):代码环境搭建
粗略的阅读过<TCP/IP详解>和<计算机网络(第五版)>后,开始啃这本<UNIX网络编程卷一:套接字联网API>,目前linux下的编程不算太了解,在阅读的过程中 ...
- 【UNIX网络编程】FIFO
管道作为进程间通信的最古老方式,它的缺点是没有名字,因此仅仅能用在有亲缘关系的父子进程之间.对于无亲缘关系的进程间.无法用管道进行通信.FIFO能够完毕无亲缘关系的进程间的通信.FIFO也被称为命名管 ...
随机推荐
- mysq访问方式
mysql -h10.81.32.196 -P5152 -Dns_map_data_new -uwangyuchuan_r -p3DLg15rhSsm0O7Nsselect uid,name from ...
- 如何删除由Automater创建的服务
想要设置两个实用的快捷设置(如何设置): 1.复制当前文件或者文件夹路径 2.在终端打开文件夹 然后想到可以用mac自带的自动操作这款软件,英文叫Automater.接着发现,显示路径栏后,直接就提供 ...
- UI自动化之特殊处理四(获取元素属性\爬取页面源码\常用断言)
获取元素属性\爬取页面源码\常用断言,最终目的都是为了验证我们实际结果是否等于预期结果 目录 1.获取元素属性 2.爬取页面源码 3.常用断言 1.获取元素属性 获取title:driver.titl ...
- 负载均衡环境搭建(nginx和tomcat)
偶然看到博客上一篇负载均衡的文章,学习了一下,此处做下记录 目录 1.环境准备 2.tomcat配置 3.nginx配置 1.环境准备 第一步:java环境 第二步:nginx和pcre源码包 下载链 ...
- PHP 图片+文字+二维码生成小程序分享海报
思路: 1.请求微信接口获取一定尺寸微信二维码 2.准备海报主图,处理尺寸按比例缩放 3.准备分享语录,计算段落高度 4.生成海报:创建画布,分写别入按顺序和位置写入二维码.图片.文字等 5.保存海报 ...
- nginx windows安装基础
nginx在 window上运行需要1.17.3以上. 官方文件https://nginx.org/en/docs/windows.html nginx启动: 1:进入安装目录,双击nginx.exe ...
- python接口自动化:调试接口的代码(无token情况下)
实现代码如下: #接口调试 import requests,time class api_demo1: def __init__(self,RequestWay,url,data): self.s=r ...
- 二维数组中的查找-剑指 offerP38
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路:<剑指 ...
- Maven-Eclipse使用maven创建HelloWorld Java项目,maven常用的命令解析
1.开发过程常用的maven命令有: mvn clean mvn compile mvn test mvn package mvn install mvn deploy 2.mvn clean:清理t ...
- kafka+hbase+hive实现实时接入数据至hive
整体架构: 项目目标,实现配置mysql,便可以自动化入湖至Hive,入湖至Hive方便后期数据分析. 首先在Mysql中配置好kafka的topic.Server以及入户表等信息,java程序初始化 ...