TCP에게는 데이터의 경계가 없다.
이 특성에 의해 전송을 할때 TCP의 룰에따라 재포장 되는 것에 의해 문제가 생길 수 있다.
한글 1글자가 1바이트라 가정하자
"아버지가 방에 들어가신다" 를 TCP 룰을 바꿔 전송을 한다고 치면
4바이트씩 끊어전송
아버지가 / 방에 들어 / 가신다
3바이트씩 끊어 전송
아버지 / 가방에 / 들어가 / 신다
둘의 의미는 확연히 달라지게 된다.
어플리케이션 프로토콜의 정의
서버, 클라이언트의 구현과정에서 하나 둘씩 만들어지는 약속들을 모아 '어플리케이션 프로토콜' 이라 한다.
목적에 맞는 프로그램의 구현에 따라서 정의하게 되는 약속이라 할 수 있다.
TCP 소켓에 존재하는 입출력 버퍼
A : 데이터의 전송, 수신이 일어나는 순간은 언제일까요 ?
Q : Write, Read 함수가 호출되는 순간 아닐까요 ?
A : 정확히는 WRITE 함수가 호출될 때, 데이터는 출력버퍼로 이동을 하고,
Read 함수가 호출되는 순간 입력버퍼에 저장된 데이터를 읽어 들이게 된답니다.
Q : 예?
WRITE 함수가 호출되면 출력버퍼란 곳에서 데이터가 전달되어서 상황에 맞게 적절히 데이터를 상대방의 입력버퍼로 전송한다.
그럼 상대방은 Read 함수 호출을 통해 입력버퍼에 저장된 데이터를 읽는 것이다.
특성을 정리하면 다음과 같다.
- 입출력 버퍼는 TCP 소켓 각각에 대해 별도로 존재한다.
- 입출력 버퍼는 소켓생성시 자동으로 생성된다.
- 소켓을 닫아도 출력버퍼에 남아있는 데이터는 계속해서 전송이 이뤄진다.
- 소켓을 닫으면 입력버퍼에 남아있는 데이터는 소멸되어버린다.
Q : 50 바이트만큼의 입력버퍼가 여유가 있는데 만약 100바이트가 전송되면 난리나는거 아닌가요 ?
A : 그런일은 일어나지 않습니다.
Q : ?!
TCP 는 rwnd 를 통해 현재 비어있는 분량을 지속적으로 알려주기 때문에, 입력버퍼의 크기를 초과하는 데이터의 전송은 일어나지 않습니다 !
- 복습 -
연결 = SYN
ACK = 이제 받아야할 패킷의 번호를 부여
FIN = 종료