[Network] TCP의 구조
이전 글 에서 연결형 통신의 프로토콜로 TCP가 있다고 했다.
이 포스팅에선 전송계층에서 신뢰할 수 있는 정확한 통신을 제공하는 TCP 프로토콜의 구조에 대해 알아보자.
데이터를 보내며 OSI의 각 계층을 지날때마다 데이터엔 헤더가 붙는다.
TCP로 전송할때 붙이는 헤더를 TCP헤더라고 하고 이 TCP헤더가 붙은 데이터를 세그먼트(segment)라고 한다.
TCP헤더의 11개 정보
1. 출발지 포트번호 16비트
2. 목적지 포트번호 16비트
3. 일련번호 32비트
4. 확인 응답번호 32비트
5. 헤더길이 4비트
6. 예약 영역 6비트
7. 코드 비트 6비트
8. 윈도우 크기 16비트
9. 체크섬 16비트
10. 긴급 포인터 16비트
11.옵션
많다. 많아...
연결형 통신(TCP 통신)은 꼼꼼하게 상대방을 확인하면서 데이터를 전달해야 한다. 이 데이터를 전송하기 전에 해야 하는 작업이 있는데
데이터를 전송하려면 먼저 연결(Connection)이라는 가상의 독점 통신로를 확보해야 한다. (소켓통신의 그 느낌인가보다.)
이 연결을 확립한 후에 데이터를 전송할 수 있다.
어떻게 연결을 확립할까 ? 3-way 핸드셰이크
TCP헤더의 7번 코드 비트 부분을 살펴보자.
코드 비트는 TCP 헤더의 107번째 비트부터 112번째 비트까지 6비트로 연결의 제어 정보가 기록되는곳이다.
코드 비트(6비트)
URG | ACK | PSH | RST | SYN | FIN |
0 | 0 | 0 | 0 | 0 | 0 |
코드비트는 각 비트별로 역할이 있다. 초기값은 0이고 비트가 활성화 되면 1이 된다.
연결을 확립하려면 이중 SYN과 ACK가 필요하다.
SYN은 연결 요청,
ACK는 확인 응답 을 뜻한다.
신뢰할 수 있는 연결을 하려면 데이터를 전송하기 전에 패킷을 3번 교환한다.
위 그림은 화살표의 순서대로
첫번째로 통신을 하려는 컴퓨터2 에게 허가를 받아야 하므로 연결확립 허가를 요청한다. (SYN 이 0 에서 1로 활성)
두번째로 컴퓨터2가 컴퓨터1이 보낸 요청을 받은 후 응답회신을 위해 연결확립 응답 ACK를 보내며 동시에 데이터 전송 허가를 받기 위해 연결확립 요청SYN을 보낸다. (ACK, SYN 이 0 에서 1로 활성)
세번째로 컴퓨터2의 요청을 받은 컴퓨터1이 컴퓨터2로 허가한다는 응답으로 연결확립 응답 ACK를 보내며( ACK이 0 에서 1로 활성)
연결이 확립된다.
이때 ACK와 SYN을 를 경우에 맞게 활성화 시킨다.
이처럼 데이터를 보내기 전, 연결을 확립하기 위해 패킷요청을 세번 교환하는 것을 3-way핸드셰이크( three-way handshake)라고 한다.
데이터를 전송한 후에도 연결을 끊기 위한 요청을 교환해야 한다.
연결을 끊을 땐 FIN과 ACK를 사용하는데
FIN은 연결 종료를 뜻한다.