대화를하기 위해선 방법이 있어야한다.
방법이 프로토콜이다
대화에 필요한 통신 규약
컴퓨터 관점 => 컴퓨터 상호간의 대화에 필요한 통신규약
다음 함수 실행
int socket(int 프로토콜 체계, int 데이터 전송방식, int 프로토콜 정보)
실행에 성공하면 리턴값으로 파일 디스크립터 값을 주고 실패하면 -1을 준다
프로토콜 체계?
소켓의 타입
소켓 생성은 어디에 데이터를 송수신할지를 나타내는게 아니다!!
단지 인터페이스만 생성!!
TCP
reliable
중간에 데이터가 소멸되지 않고 전송됨
전송 순서대로 데이터가 수신됨
데이터의 경계가 존재하지 않음
1대1 통신
소켓의 내부 버퍼에 데이터를 저장한다.
그래서 전송이 되었다고 바로 함수를 호출해야하는 것은 아니다.
버퍼의 용량을 초과하지 않는 한 데이터를 읽거나 보낼 수 있다.
함수 호출의 횟수는 의미가 크게 없다. 그래서 데이터의 경계가 없다고 한다
그렇다면 수신 버퍼가 꽉 차면 데이터가 손실이 되나?
=> 소켓이 데이터를 전송(송신)하지 않으므로 손실이 안됨.
즉 신뢰성있는 순차적인 연결 지향 데이터 전송 방식이다.
신뢰성과 순차적 데이터 전송을 보장 안하는 빠른 데이터 전송을 목적으로하는 방식
대부분의 경우 0을 넣어줘도 원하는 소켓을 생성할 수 있다.
단, 하나의 프로토콜 체계안에 데이터 전송방식이 동일한 프로토콜이 두개 이상 존재하는 경우
즉 소켓의 데이터 전송방식은 같지만, 프로토콜이 나뉘는 경우에는 세번째 인자를 통해 정보를 구체화 해야한다.
TCP에서만 필요하고 UDP는 필요없다.
연결은 클라이언트, 서버에서 일어난다
연결이 일어나면 passive active 둘다 하는 역할이 비슷하다
TCP의 이론이다
TCP의 데이터 송수신에는 경계가 없다고 했다.
그래서 40바이트를 전송하면 10바이트씩 읽어오는 것이 가능하다
먼저 10 바이트만 수신한다면 나머지 30바이트는 어디에 있는가??
버퍼에 존재한다
입출력 함수가 호출되는 순간 바로 데이터가 전송되지 않는다.
데이터들은 먼저 버퍼에 들어간다!!
write 함수의 데이터는 출력버퍼로 => 상대방의 입력버퍼로
read 함수의 데이터는 입력버퍼로 => 상대방의 출력버퍼로
write함수를 통해 출력 버퍼에 전달된 데이터를 상대방의 입력버퍼로 전송한다.
입출력 버퍼는 TCP 소켓에 각각 별도로 존재
입출력버퍼는 소켓 생성시 자동으로 생성됨
소켓을 닫아도 출력버퍼에 남아있는 데이터는 전송이 된다
소켓을 닫으면 입력버퍼에 있는 데이터는 소멸된다
그럼 만약 버퍼 크기보다 큰 데이터를 전송할려면??
write 함수가 반환되는 시점은 데이터가 출력버퍼로 이동되었을 때!!
TCP 소켓은 3-way handshaking으로 연결이 된다.
3-way handshaking
-과정-
A: 연결 요청을 한다.
이를 통해 A B 상호간에 데이터 송수신을 위한 준비가 되었다
이렇게 패킷에 번호를 붙여서 TCP는 reliable하다! 손실이 없다
ACK 메세지는 = SEQ 번호 + 전송된 바이트 크기 + 1
1을 더하는 이유는 다음 전달될 SEQ 번호를 알리기 위해서
만약 패킷이 소멸된다면??