2014년 12월 9일 화요일

TCP/IP 소켓 프로그래밍 5강

원래는 4강에 있는 소스에서 나타난 문제점을 해결하는 강인데
후반에 이론이 있기에 이론만 설명하려고 한다 ㅡ.ㅡ;
내가 절대로 소스코드를 여기에 적기 싫어서 이러는거다.

1. TCP 소켓에 존재하는 입출력 버퍼

TCP 소켓의 데이터 송수신에는 경계가 없다.
서버가 한번의 write 함수 호출을 통해서 40바이트를 전송해도
클라이언트는 4번의 read 함수 호출을 통해서 10바이트씩 데이터를 수신하는 것이 가능하다
근데, 10바이트 보내고 나면 나머지 30바이트는 어디에 있는걸까??
write()가 호출되면 출력버퍼에, read()가 호출되면 입력버퍼에 전송된다.

-입출력 버퍼는 TCP 소켓 각각에 대해 별도로 존재한다
-입출력 버퍼는 소켓생성시 자동으로 생성된다
-소켓을 닫아도 출력버퍼에 남아있는 데이터는 계속해서 전송이 이뤄진다.
-소켓을 닫으면 입력버퍼에 남아있는 데이터는 소멸되어 버린다.

2. TCP의 내부 동작원리1 : 상대 소켓과의 연결

TCP 소켓의 생성에서 소멸의 과정까지 거치는 단계는 다음과 같다
-상대 소켓과의 연결
-상대 소켓과의 데이터 송수신
-상대 소켓과의 연결종료

예를 들면 호스트 a와 호스트 b가 통신을 하려고 한다고 하면

1) a -> b : [SYN] SEQ:1000 ACK:-
2) b -> a : [SYN+ACK] SEQ:2000 ACK:1001
3) a -> b : [ACK] SEQ:1001 ACK:2001

를 서로 주고 받는다.
그럼 각 의미를 알아보자

1) a가 b랑 통신하려면 먼저 b가 통신 가능한지 물어봐야 한다

처음 연결요청에 사용되는 메시지이기 때문에 이 메시지를 가리켜 SYN이라 한다
SYN은 Synchronization의 줄임말이고, 데이터 송수신에 앞서 '동기화 메시지'라는 의미를 가지고 있다.

2) b가 a에게 2000번의 번호를 부여하니 잘 받았으면 2001번의 패킷을 전달해줘이다.
ack 1001번은 1번에서 보낸 SEQ 1000은 잘 받았으니 1001번을 보내달라는 표시다

이번에는 a에게 받은 1000에 대한 응답 + 새로운 2000번을 동시에 보냈다.
b가 a에 대한 응답과 동기화 메세지를 동시에 보내서 SYN+ACK라고 부른다

3) a는 1001번 패킷을 받고 2000인 패킷은 잘 받았으니, 다음 번에는 SEQ가 2001인 패킷을 전송해달라고 요청한다.

한마디로 서로 제대로 접속해서 살아있는지 서로 확인하는 과정이다.
이렇게 3번을 왔다갔다 한다고 하여 Three-way handshaking 이라고 한다.
3번 악수하며 확인했다는 것이다 ㅡ.ㅡ

3. TCP의 내부 동작 원리 2 :상태 소켓과의 데이터 송수신

데이터 송수신 준비가 끝났으니 실질적인 데이터를 송수신 해보자.
만약 a가 b에게 총 200바이트를 두번에 나눠서 전송한다고 가정하고 설명해본다
ACK 번호 -> SEQ번호 + 전송된 바이트 크기 + 1

1) a -> b : SEQ 1200, 100바이트 데이터
2) b -> a : ACK 1301
3) a -> b : SEQ 1301, 100바이트 데이터
4) b -> a : ACK 1402

1) 100바이트의 데이터를 보내면서 1200번을 패킷에 부여해서 b로 보낸다
2) 잘 받은 b는 1301번을 패킷에 부여해서 다시 보낸다.
(1301이 된 이유는 받은 1200 + 100 바이트 데이터 + 다음 숫자 1)
3) 1301번을 잘 받았으면, 다음 100바이트 데이터를 b로 보낸다
4) 잘 받았으면 1402번을 a로 보낸다

4. TCP의 내부 동작 원리 3 : 상대 소켓과의 연결 종료

1) a->b : [FIN] SEQ:5000 ACK: -
2) b->a : [ACK] SEQ:7500 ACK:5001
3) b->a : [FIN] SEQ:7501 ACK:5001
4) a->b : [ACK] SEQ:5001 ACK:7502

1) a가 b에게 종료를 하겠다고 알린다. FIN이 종료를 알리는 메시지다
2) b가 a에게 내용을 잘 받았다고 5001번을 부여해서 응답한다
3) b가 a에게 자신도 종료할 준비가 되었다고 알린다
4) a가 b에게 잘 받았다고 응답하고 종료한다.

이것도 역시 소스코드를 보며 구현해보는 것이 좋겠다.

소스 코드 받기

다음 6강은 UDP 소켓인데 내가 이제 막 책으로 공부하고 있는 과정이라
공부가 끝나면 여기에 올리겠다 ㅡㅡ;;
(오늘까지는 공부했던 과정이라 연속으로 올릴수 있었다 ㅎㅎ;;)

댓글 없음:

댓글 쓰기