- TCP는 트랜스 포트 계층에 위치하고 있다. UDP와 달리 Connection-oriented(연결위주)전송 방식이다. data 전송 전에 송·수신 양쪽 TCP들 사이에 TCP연결을 미리 설정하여야 한다. 또 TCP는 Reliable data transfer(신뢰성 있는 data 전달)을 한다. 이때 필수로 ACK message와 Retransmission Timer가 필요하다.
- TCP는 data전송을 하기 전 필수로 송·수신 간 TCP 연결을 한 후 data전송을 한다. 그 후 data전송을 완료하면 송·수신 간 TCP 연결을 해제 하는 과정이 필요하다.
- TCP는 port번호의 형식은 UDP와 같은 형식으로 사용한다. 클라이언트는 ephemeral port(임의의 포트번호)를 사용하고 서버는 well-known port(표준으로 지정된 포트번호)를 사용한다.
- TCP 패킷의 형태는source port와 destination port, 송·수신 간 data가 잘 전송이 되었는지 확인하기 위한 sequence number와 acknowledgement number가 들어가며 TCP head 길이를 나타내는 head length, flag영역인 U, A, P, R, S, F 영역이 들어가며 수신측의 수신가는한 버퍼 용량을 나타내는 receive window size영역과 오류를 검사하는 checksum영역. urgent data의 위치를 나타내는 urg.data pointer영역, 그리고 option영역과 응용계층에서 받은 데이터를 나타내기위한 application data영역으로 구성되어 있다.
- flag영역은 U, A. P, R, S, F로 구성되어 있는데 각각 URG(urgent data), ACK, PSH(push data now), RST(reset), SYN(연결 설정과정에서 사용되는 패킷을 나타냄), FIN(연결 종료과정에서 사용되는 패킷을 나타냄)을 나타낸다. 아래그림은 각 field에 따른 의미이다.
URG - Urgent pointer 영역에 긴급 data보유
ACK - Acknowledgement 포함
PSH - Application layer 로 즉시처리요구
RST - 현재의 연결을 즉시 단절 지시( 오류발생 시 사용)
SYN - 연결 설정 시작 요구
FIN - 정상적인연결 단절 요구
- 만약 URG영역이 1이 들어갈 경우 urgent data는 헤드 영역 바로 뒤에 붙게 되고 urgent point는 헤드 끝부터 어디까지가 urgent data인 것을 알려준다.
- sequence number는 송신 바이트 번호 즉 내가 전송하려는 data의 번호를 나타낸다.
- 또, acknowledgement number는 다음에 받기를 원하는 sequence number를 나타낸다.
- 만약 송신 측이 sequence number를 10으로 하여 10byte를 보내면 수신측은 10~19까지 10byte를 수신하게 되고 이때 수신측이 발생시키는 ACK의 값은 20이 된다. ACK를 받은 송신측은 ACK의 값인 20부터 다시 10byte의 data를 전송시키게 된다.
-Option은 TLV(Type+Length+Value)로 구성되어 있으며 TCP의 Length영역은 DHCP와 다르게 Type+Length+Value의 크기를 다 더한 값이 저장이 된다.(DHCP에서는 Value의 크기만 나타냄
- end of option list는 option의 끝을 의미하고 No operation은 option영역의 크기를 4byte의 배수로 맞추기 위해서 사용하며 MSS는 Maximum Segment Size로 TCP의 최대 data크기로 최대 송신 Size를 나타낸다. 간혹 SYN message의 option으로 넣기도 한다.
※ TCP는 Connection control, Error control, Flow control, Congestioncontrol의 기능을 한다.
①-⑴ Connection control
- Data 송수신 전 연결하는 과정은 연결을 하기 위해서 발생하는 message의 종류로 SYN, ACK가 발생한다.
- TCP 연결을 하기 위해서 클라이언트가 서버로 SYN message를 보내면 서버는 SYN과 ACK를 보내고 다시 클라이언트는 서버로 마지막으로 ACK를 보내게 되고 TCP 연결이 된다. 이 과정에서 총 3개의 패킷이 발생하게 되는데 이를 3-way handshaking이라고 한다.
- data 송·수신이 끝난 후 TCP 연결을 해제하는 과정은 연결을 해제 하기 위해서 발생하는 message의 종류로 FIN, ACK가 발생한다.
- TCP 연결을 해제 하기 위해서 연결을 종료하려고 하는 A에서 FIN message를 B에게 전송하면 B는 받은 FIN에 대하여 ACK를 발생시키고 난 후 B가 종료가 될 준비가 되면 FIN과 ACK를 전송한다. FIN과 ACK를 받은 A는 B에게 마지막으로 ACK를 발생시켜 연결을 종료한다.
* 이때 중요한 것은 최초 발생하는 SYN message의 flag영역은 SYN부분만 1로 되어 있다. 이유는 SYN message 발생 전 data를 주고 받지 않기 때문이다. 최초 발생되는 FIN message의 flag영역은 FIN부분만 1로 되어있지 않고 ACK영역도 1로 되어있을 것이다. 이유는 FIN message 발생 직 전 data를 주고 받았기 때문에 ACK도 1로 되어있다.
①-⑵ Connection Reset
- TCP Reset message가 발생하는 과정은 client와 server가 TCP 연결이 되었고 data를 송·수신 중이였는데 server가 down된 후 client는 server가 down되었는지 안되었는지 모르기 때문에 data를 송신하게 된다. 그럼 data를 받은 server는 이전에 TCP 연결이 되어있던 client가 있었는지 없었는지 모르는 상태이기 때문에 data를 전송한 client에게 강제로 접속을 종료하겠다는 Reset message를 보내게 된다.
- 이 밖에도 server에 잘못된 SYN message를 수신하였을 경우에도 Reset을 발생시키고, TCP연결 후 data의 송·수신 과정이 오랜 시간동안 없을 경우 Reset이 발생된다.
② Error Control
- Rule 1 : client가 seq값을 1201로 하여 200byte를 data를 전송을 하며 ACK 값을 4001로 하여 server에게 4001번 data를 보내라고 하였다. 그럼 server는 seq값을 4001부터 전송을 하게 되며 1201~1400까지 data를 받았기 때문에 ACK를 1401로 하여 전송을 하게 된다.
- Rule 2 : server가 client로 ACK를 1401로 하여 전송을 하였지만 client의 buffer에는 1401번부터 data가 없는 것을 알고 application에서 data를 줄때까지 약간의 시간을 기다리지만 data가 없는 것을 알고 server에서 보낸 data에 대한 ACK만 발생한다.
- Rule 3 : 전송하는 data는 필요에 따라 여러 개 보낼 수 있다. 이 경우에는 buffer에 data가 많은 것을 server가 감지하고 5001~6000까지 보낸 후 6001~7000까지 한번 더 보냈다. 이 때 클라이언트는 수신한 data에 대하여 ACK를 발생시키는데 이때 2번 발생하는 것이 아니라 마지막에 받은 data에 대해서 ACK가 발생한다.
- Rule 4 : 이 경우는 data가 필요에 따라 여러 개 보냈는데 먼저 보낸 data가 중간에 없어지고 나중에 보낸 data가 제대로 도착하였을 경우 data를 받은 쪽은 ACK를 마지막에 받은 data에 대해서 발생시키지 않고 못 받은 data를 받기 위하여 잃어버린 data에 대해서 ACK를 발생 시킨다.
- Rule 5 : 잃어버린 data에 대한 ACK를 수신 받은 쪽은 나중에라도 잃어버린 data에 대한 ACK를 수신 받을 수도 있기 때문에 RTO(Retransmission Time Out)동안 기다린다. ACK를 못받고 RTO가 종료가 되면 data를 재 전송하게된다. 그럼 data를 받은 쪽은 재 전송 받은 data에 대해서 ACK를 발생 시키는 것이 아니라 buffer에 저장되어 있는 마지막 data 다음에 받아야 될 data를 나타내는 ACK를 발생 시킨다.
- Rule 6 : data를 수신하여 ACK를 발생 시켰지만 ACK가 중간에 없어졌다. 그럼 data를 전송하는 쪽은 ACK를 기다리다가 전송한 data가 가지고 있는 RTO가 종료가 되면 한번 더 재 전송하게 되고 같은 ACK가 발생된다.
- Piggybacked ACK란 data와 ACK를 함께 포함하고 있는 message를 말한다.
③ Timer의 종류(Retransmission, Persistence, Keepalive, TIME-WAIT)
- Retransmission Timer란 data를 TCP 연결이 끝난 직후 data를 전송하게 되는데 data를 받는 쪽이 TCP 연결 직 후 고장이 나버려 응답을 할 수 없게 된 경우에 발생하게 된다. 송신측은 data를 전송 한 후 응답을 기다리지만 수신측은 응답을 할 수가 없어 송신측은 RTO가 종료가 되면 재 전송을 하게 된다. 하지만 응답은 오지 않기 때문에 재 전송 하는 시간을 2배씩 늘리게 된다. 재 전송 Timer가 약 1분이 되면 더 이상 2배로 늘리지 않고 재 전송을 하게 된다. 이때 계속 data를 재 전송하지 않고 data를 전송하고 난 후 약 10분 전에 연결을 종료 하게 된다.
- Keepalive Timer 란 TCP 연결이 되어 있는 상태에서 data가 송·수신을 하지 않을 경우 Keepalive time 동안 TCP 연결을 종료하지 않고 유지 하고 있게 된다. 그 후 Keepalive time이 끝나면 data를 수신하는 쪽은 송신측에게 data이제 더 이상 보낼 것 없냐 라고 물어보는 Probe message를 발생 시키게 되고 Probe message에 대한 ACK가 오면 TCP 연결은 유지 하게 되고 만약 ACK가 발생하지 않아 Probe message의 재 전송을 약 10번(이하)동안 보냈지만 ACK가 발생하지 않으면 Reset을 발생시키고 강제로 종료하게 된다.
'IT > 통신프로토콜 실습&연습문제' 카테고리의 다른 글
통신프로토콜 TCP 이론 및 문제풀이(4) (0) | 2016.12.21 |
---|---|
통신프로토콜 TCP(3) (0) | 2016.12.21 |
통신프로토콜 DNS(2) (0) | 2016.12.20 |
통신프로토콜 DNS(1) (0) | 2016.12.19 |
통신프로토콜 DHCP&연습문제(2) (0) | 2016.12.19 |