From 3b7bf4bd99e97c68c452d549855bcb23d647edc9 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 11:00:00 +0100 Subject: [PATCH 01/35] osi --- 2026/day-14/OSI Models 2.jpg | Bin 0 -> 27558 bytes 2026/day-14/OSI Models.jpg | Bin 0 -> 36236 bytes 2026/day-14/day-14-networking.md | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 2026/day-14/OSI Models 2.jpg create mode 100644 2026/day-14/OSI Models.jpg create mode 100644 2026/day-14/day-14-networking.md diff --git a/2026/day-14/OSI Models 2.jpg b/2026/day-14/OSI Models 2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc99a5e202a73c7acb6b12669708074fe15205fe GIT binary patch literal 27558 zcmeFY1yr2PvM4$P4I11bxVw9Bhv4oKhQU2Sl0fj_?t$QLgS&fhcXxMvgn#dS{{8Q> z*FEp7ci+0}t~0D@db+Bs>#OSOs;=(uY5Hjy@J2>LS^@w80RTWe{{f!n0HOdm7#LU> zXgF9{*w?S&;1My95D^d%anaCGFbMI8i3srs2;P!2QoSXmCnF%B=AxlzW?^S%C#K>N z;AZ7#WMgOjO$6fg>(__~h&V_{IIJWDB&`3hKTjTzHeL0uIHnYHex`{3Jksy+ z{yy0A|K|~)V4z{2fjp=Hh*!^p!$Ly+9q0KssuC0$2@5)guu*#1F*K&K{nv;Q*47m) zc99bpQZhE<$knG=03zfwT~tU^fDqtlJKzf`DIg%=73o{J|6i+ue9LL18k}p8$!SJ^544Dx9>WnS*i~mb7;Cd`KU|5K(322zCoKFs<DE~2_=ZVH{%EO|K@HwGi(4EmFl95ztn+rTdOFrF`7R2jChXU#gh9fJ zd=~h^WZ4-@+|2l!0b4c)U7J?}NJ)0qB`HbM*~^qH46bx0%st1eW5{xYCX4&sb-dws zI-Oogi1QU{s!Lb*m|*gN;Q9lhS|kH7&VjXl|D>>QJT+Z@8UyEH&1On+ss>9G+uPox zT01}k0w@Obu zXdJ^Q2wdu2!8rT5DQDu&^yuh{hxaO><@5t&6}bE`OifnFHTKGsX=JhsR!y)+rA zhs!uL`lbZI_Y>gPbtBs^^=cLzLPb3l@}RNIT~U>CJ&75lq{1u1soX@Hk3B>`)!5on zrLMCwm*Z{3ezDHUlq2M$lk#@vA(1;3S2S4teYxFkx&ea*b&vq$I>-{j-AAI<39AxcsxYplsWbu67NnJg=G@^QfCJF;^vn0*xEQzB;Q|5e!QIdMfCkLrA-%QP~v_P!!= z>NxFVWMrZuQ{O|T#Dw*Pl`~F9bPf84_ENuY1~u9IQ-P5>&K^0d9!H)cdva`c3y#Tl z3BAfNsLqocTH2oxQN|d@N}R=oqEH|6v`8opYfPN%IiVt*pkh|j%ve4R7+6w&Y#onR zGs?+H62N6lWl_Y}-8P7aiCSQfBw}BNV&y?mD4UcebtZ^{UClTj78aqh{2lap&D$@+ zu(Fy-Xkl$T_Ovc?`zmOmRX_p+G4?jNp8)Man-6^Y*et@WUqYL;-l!HO?%k^nHDq@gKBHIDo=k?!J8Sg=~AW2i{ zIlpgoo`Bb}T#%U&qAo-F(aN%^`h^8ok3ZhAKW*L&$(0I`p~C8T3RL2pUu}q~hHfn} zAxeKLjluDrlagn>iW#^@&hGR|n%60&h_P=ClUuHaP<^;O2R6nJ`)Ip=j}UcrjPs0! zbBrbQa*sF9gAU3DJIHt}sm-iQj9L3%g30R{z+jLgW!2>=Lcg^ox*Vabt&o?F3-O?VI_Ye#9LQ|f!i85C8Gg2}LAe@@!zm_0nfJJF zN3?%&b0Or_As3G@9)uTjiru~MUfA+{{*`35H@t?;HqDX_{e8@JDCw+)0ipsDE6+xz z_o{oWU)`Ech*idwa1?eFQg-X{tYuw(wQAQXsKuMBJ&FYl96HoSY`47l<6Uh(jY@f_ zpDtw%RAH!J31T+8eZmhmiEB9P=}lPn6B8+tcBL`r*t8FO$Si)wG1t|!c|Sw5LSMy8 zOxeo9Apx!!Y-9nlflb9)0_!s7^Mi&x~-gskr)UN;{0ib{Oc;l!0+7 z=KNJEptH9K#7k0BVKul}!a0g4Mw^{v^;|2>K)Q@xm|zvRMf_hl$RvKYuKeYRGM<~d zGi;Srmo<$gZM%ZaAMz=p5DMD&*0MX8w^JY~5|jH0B5K&VdA<(vYmU;d81t&$T%@fH zdwGrCg}*;Arwcq#fWYKnXIAR#>(UTr5Krzka@RchiEKC*xgcRRyHTn$jt^vzEuGCz zW~rQ3puJ)Z%2eG951$gK?>YU_vRT%lHMHGWl2a!i;tX}ICWqrgs3J=tx|^Ap#+a>W37<#sphKc}E5X3WW?(Cw)lQZNb1Pt62?oWhn1!QFvDEjny*Zw2Y|$#(ZagS7 zVXQk{W!@|Cg3+b3EI6Suy0C3oB0>r9-nGo#WR+^Q8gLr%)8?#!G$z_Zg8-j*`yWJK zlp96;@~uik=uF+-rWIEJzV6%N`bhL1hhVZMm}dbSeBSSCRYl_O=!sv}E$y>1g)u(T zViI%Er#&hE)-w|%yo@s!K5A=iZ#0K5KoD=nfBo}A+i_f-44%DwtVD7#$TiZOWTnXQ zONGve`CEhf!fCblXJD<&%JB=!`XowLad=pe%awvbO z4Lw&}=QN47$sF~6=mHPEV^FN{$NrgwY)uBt3N1lI+hw}xsV|GTeY~_o z5C(wUQ`nKRviwqfJ0n;Mf%dg;5iHB~(j8m+0)n1b>3_`A|Ed1TbfHg%kbw5f*b{yQ z7eM|1WKYS%Gyx|Y4{kj!ht(;L3DY-{!KBkyZN-n6vghrO2!W#X;X_vvt7GxUr$wm- zDl0O_DWK5c3kRNRodfFpfWz0vE{YzsM=Pq$aze|g*J?{`d0z3KTkV^E<2u}?!K;EI z?seaE8&qD`P_@no92YeEDnBqk0leK;G(N*;-5Naspu2876@6*?cRgt29fX3tk-WxM zm(yTP|G~!VBVWCH+PEG6du;rT3qgz=ro7`Uj-E$GIF38TU~dn?s3rLNYc-}ZlxwOc zOxNRlgKXksUE8?vYvtsooVMsGvg?|+QwM^K|4VLFbi-Dcef}HF>K9ze$1RKWq`{0){bfWlfr>jfB{P z_o17OL(s^N3V$h9{Ok;Nm#Uzk%NHj^yr8J9R;sw0a-ZlGOl@Q5|u=p_2k3@je@IBlKk@tppw5Zw!#Prgx_Nx$emRBcjX@=}SGU5XyZ zRWPY18B6PR+Ug4(L@5?>aNLkI_n#uJRla#9qVOB*p$LDpDscFVP={R2DODR2!@?f;cT1U-jA zf%LjoEMCb(=IL7@I0ktr!8QtgcCPO3L z=r~7~qg9=dqEKvI#kt6e?Cg0m`;a{qz9g^7^TiNW#5lQm(F|eQU}uGlw&DU^PT%u= zT?OowC`YurgsYV|`QSLyJAq5Nc{Ov_zE>$Nuynh$C^|8Wb!v{A^)iAkZ@Rx)VVGtf z)O_?Xp|=P!#3xbzNN-%_AEVYnm6J7eupYut16kXLf@&<@GrC78*#CEQwRmzs^A~3>G&D(aG!7}l=nyhFFqm|L zCR&9xzE~aT*}Ux&;Tm!$#9v5BT2+wyaiveCY005MPe~R-UH;2-Lr5@Fvot=S#yF7w zz9QQ^83(YLDA6m^8pwykZi_C^TGhuFXU5Oy7UE&aZ^+6$p{S%HDJqXCns*h69b3B= ztc^Ft{e@R*x3(_zKKn<0Y+{BM7vt8U_VsDadeGqHGN}E_gvEr0(R33r2m0PxribRY z2^Lv4a+aR%xkljI?>_@}R!bdNl!0k0X^)NX<5;nznv~U@8$8OsFw{YpAaMkp29S3wQcct0X6rcD{g?}vqr zyw17u%U(cTKmcLDol1{EH@qq%%4JqxbJm9hwTbSFE>cO>&^O5R9p&k47T?tg%>yci zH|-kyY8V$xAsgSyGO=nP;`O(5h!Fbi2RPw*N-tI8I+0N+=pAk5p+@W8okeS}Gy>}8 zd9kpKdNm5;j>sQ-M_L<$R(PKPyZWPDW?s#(o|qUMWfNm+qXSnG6gf<#ZeljQ%$$1$2{<1dxE?Gz zJ$_U8rn}Skr#R%_RUYJ$rp?gn@KHI{M*D`#Ce6;L}N^;v- zCoOV3CEq|3n|Zr5Cny>8Q#f(3)3Vph>^?U0K>4=iZ(t0d;dlr;3aWl0a2Ek_Oq#?5 z5>J11zlZ?P4B(A8Q>0fCCm$8${)$>QM9#Xo*`BeX`I#b*PqnF(Y8^~v88-V zPJMS$TfvmLD(J!F%p5J#mE)3j9tm-az=8%7dh%YYFA8mXj@BGgYH_%UT*hklK^BQC zbj{od6@(r()n!&=kF{Sv!ae~^Vw)naP$#Za)eW#9ucoH8XgS!cdG zfNyN4qLb)Z#C9?ffreDgZWd=zX4Mp`sH|=~KO(~7Y8*48`Dz>Y0Tw$Dz{b#!jW8g{ z?;E$KFG#H~KCVnZ?{Vg$VUAngFkCX0e%-w4Ar4&P#m`VQ6>6KtZ1V|}b|3!)=#^pj zTYDGl4dodW zeXjjOXGlG#@lZOb^9mIhTu6te8{KYyNE=>nk@)Z~7DT(gDV|s^Bp2n++>1%Xc@nbB zsnk0_!-%rd+8f!5nwk)WFF-?H-cbU{dj4kgTwg4*ivAPc#2;wy2xJC(wl-K*Oz-zU zR&X(oQP)oSi*yq2;BUZtj!EphG_lB{>&1Q^dUd}9y>z8BT^@+46KSQwU8Xw_WgH=i zkca9YrGO(1F`vzcCUnEpFs9+wr70ab14#K+w>b+cE*Nhv-SN^_%qwt6yBI*|5xOHN z)eI9$#dlNusFTql@e8S*M&K@BhMJZ%a5MrxzTcdsZ)&4iU)c&Admi&%tamNjTS8EO zWhnCf;pSB-#LrCV>`Pv*Sb?l!yf-Vxm;)M2;|55&d5;VBDrWK4vMY;~t@Wda9H_wt zUj!z7EvMr&?Hgmy4N7;L^o8>JKWV~;Ywg>Ee6LYE-P9%FZaTj^y=nd&AlDt&^_rpHsdl9kBn$-$ zjk3VA+)Wa35ST;PdT4VhY?=wPdXkp6Y%Ad%k7x9H5T6de+I5*E5By7vUSpG03=E!`W2OPrXZCxE}I7;S6iNW|ce7 z!U%Qzea%?EBuT+{9D=o&1slLFZ=G9VjVzH9>{#`j^z+G;n z?)dmRrcQ4{El)bo!+TBQ;<`KHV^C;@dDr$DBN}&EU5FI6pe$sk9P5WM*7s9L4;=V- zk4fAzNMYe`P!c@*V`D?c&FRZ~Sxg-W;TQm=*VkXCGIA6S8?r%rC<~*CMIG$tQ7YhK zH=s!+vdQe_QvPy;^H=F95wdhp2!EvmE`XV*o34_}4pwPmtW$z+rS4R2`rF+>;>7^{ zoWMzW-1^c(EN0S&CQjx1q$fam_HS1cWW7}VaqJeA7u7L``kzx(|9J{P)3RATs;AjYPiZf-R?L0d}eJo=AK<0Xsdk>{8kMJ zPzLB$dvo@n8X@j8g->A_UQj{B*~!MCADz+n`7y?(n~jDq;ubz;?VaQ(*&T!wVn&pns z2qpoOi!QHePH#kzFw@U5YFzNcR0P6ej(gE{7!AjaZFo_FZueF-7b=c<{qi+eiY>e$ z*l4qGO_F@uwYA|^t!&&#XVPf0C>y*GV>{6t-5n|GVdWsVjgqy<8ri>ICw`A*j)uv6f zMxQyt_I(d7sm{)MiBFcccCI*Co&eKoOK+b5xyAOd+ezyPKi8fBr3FpGPXHy|Rg@8~ z9&GEGG}%U!jDL=t5XKgFi1g1~(H%6R-@hWIf%s&yfM3BrJso`Gq_6Z2E+F$c2Exv1 z9OZA^JfvJNq5c6Sru-an32+=5+5xMKOxE?4FaQBT@5IDla|DJ!+6p09kh2XL&$(EP zFVDxjgB45oG+y#gfEgpLD)%)rrrzc|29Uu6GRJ@44)S}~f7=0UpSp7vrYa)LX(fJY zOjPXHwfe^?@WFQs$zPx+zQ{fDiAUM*ZTJ+K{B{)r6lRIdsrk)9Tv)zwkY_xh$j z=%Xh<-_-WD0g%Pg5-S0?ooS|$&Vmi^Q_qD(UK;!apr34(6#4RJxbmG_ACnKT zOZxG81=$uAg)p-6Oqq&)I9;GhkRhY5o3vorn1A);7t;fcuM%Vg1tmF0MfwMCHdzfd zpI+vs>L{*gZ7IBz;+p*-t~mLU4z!HpvHAvZT9n;$N{pmCGBDC6J`Cy!arKxN1&;J>sp@jBT}kLccSCw*Y5bYJnCsKH8O|qwS)#1!)?TEowyl9f zm;ELV9DDI%U2sJ0-Sc4pG9=TL)XDU>=n3VK55?JrrVd9|?a^9U167%B0ct~kX3sNS z9n?SgVJm1YmE556Jh0wnRlnrf%4qQL8P}ja07YyqMT=} zkL?L}QA8l~r}%9bE^KP~H;23^Czm|==Xy(yCd3cEdZ#G2L0fOU0-N5|2@1Yz0R?j6 z`#(h1I=T7Mky)^H+wpD8Tv}#uj0yV8Ad7*vY8J)whE$t~grs@;;@Z1+m=x|TKV8kK zSYzezC||ohkZ;i%pb%%q%_(_;IY%rVW0?HIMim^gj!$l-J;B)jgZL-$O#Xed)yJ2d z=fUq4xiFI-U^d$)KVRr-_XyhqK2Q+%UQ?glEK2DKau)o(3p?rmw_C42`AjVMvQJvD z4_P1n@R47(a9nUB)|}%*)WlR26L-B>nt0&?U|ip2AB2Axt7KSsSkp3e%7<)e~2Z6ydWs^*kmC21!6-AOy$T0lY)+Wc-Y$U@aL0~=u-Q+7zd4>*K)!% zQ`$k>-RHFjs2-AVUG0CrkY-9}$fH}pHnkrR>YiGxO?2s7dknua1^K+KYQ)6Hht#2R zVo2Z7qa%9o)j4H)p8w-dfal#76H^r_PpH{M-i(VCXNO5dujmoEPva%jdbn#-OL@i# zH~=g_sE&!K8;N{1jUFkyc=xI=uuwdA!svZx@7p8KuRP?0N2T<+i5=P@|9j9dD7hpk zSOBY&ws`dHb*0pW8V^h{wv*+iZb9oEmdA5JBw$6U);Cr@EX0l31zf+mhu#(PZY*>T z08>nAs`UJo&xriC^x&5#aggF$GSpJy2ms?1(&E(qeiEve{xRs9!Ak$1qxna++WPFj zuBhy=4q@wW9`j7(Mn>QgxvF>q{LL>~Pn(E2r|0G?0ly-J6BLPNW{~aJw3jB37}r5pxqMH$s6pi=3bUgnn`ln}P1y;yqxQy1po|Y&Iw; zPiR-`;7%$Wy;Nof(J`q*Gz+osPzcV_BktW9K~cg{q0!$=erYIf035wHwlp=r1koW)65U5Ex5qPB(VTcYB{iF?qtz}-V@+}cBDcG>-Y(fRI%@?@vlu4=7WlkWsaZIeRU*4;0SGSgZnLV95rl)Ut)QGsZ#@Iz+T&ioEK$cZJt3S)100ztH$Cm-| z1cR^F)^z5k+#32v^gC=Ua(JuU*m`ESf{*a2ekKwiEImvcv+O$4~d^h2b%r&a5JN8N7*I1G6j&Yo>5<(r5#)nJME721%XVv47uzJbOJdIDsf7Tu2L2X%fPy-|Mvaer2R zvmYH9wp;@0_zdl?mcVF)iV^-irIjz4DX}AiB&p0S| zj1?dj5qnflkUmHr-24QXr9RQ+vS*diBxm8G)4iVp9~GsTbh>$(mUq&TlgxDo60CC6 zG*_tEBn0w*ke|l1NUj&+PTd=D?H^FBFNXY|TsZmX{knaf&{;c4k%7*!e~d`xsF;En*c=zNI5*>m_XlZM zr>$N->u7teS;u*wtZY><(E~abQb0c}YU=vA{1M%f-El;)dkLWuu3j zLc|e29-*e#yOHU4wyU~0Hqqb}tMw}xr`pKqp)-ylsrILkaPigMZ zl4O`M(2rFJY%;nN5KW&|P><`noontaRTT2~j#S%fp*k4F*w=B!&mOE@S<^=posA!{g*(bvp+U7!DmYftWcMr1LZi882I(v{2k5iN5s99xnHSwk zGw1VWqyMiB>z7q>7hL-~a@SY;v`Z16$2A0VUd}NH+%GY0dzyFY(o`OwcOf3tpe?O(8HBY1M$vOKJkuH=dsEl$4(U;bdt z@OPVqo8D@wfCp(aO6Nog@8lm4&HU1$OB%W+mxKDUL+Wn3_CVToI^6cSdLC4!_Pc%VL?%cS3XK8+CGuGjb zMZY4v=rws{tp8FNz(T}dT9#eWz> z``&JLcDDTna>TmD0>^3bTsc&|X=%nGe=OfE$w$xJ{37FgSvHrhfS_{DvZHCWX42pJ zDo==4luNmEn_~ha`;(-X_ayQpM1i`>Vb}$E-_Y6Ok2$RU%N*5*dMoELw`tgIymF*x z%9KJJXdH)l$GG>@6!f%a70Y;>KL75Y6zhTl)i{WnO;)pY$cwOV6}y>qXQY z8LWo2BDPSl>c&J$<{fssfjR_#=8gB?286X zlw5Z<3I+Z+oGk~dVLC7*ybO`kzk4Uz82C~K{T`j%bs@F^!Q6f_p33u-?;Eh zU+mnNVC%PDKP1Us^T&+(+*Pz)Q73Y_5UZT_YPuW1p zH>`mdj>T{uKqr)AoGSGUR6JFg&NRrsg%wX@aFXO;w?d4!c96o`HX8U?<7-8*tROgnLiR8kB1{2dfx%tHxc-;RCEVg2H;R)L zx)+5k_JS%Gh5g$Dx9_)7;%oP0Q!B+IUTqaIewyf$BJFUIeBIs-OaDezfUQnn^f_4F zgzgTh+R?WxO?By{X-{HX%V{%8*#BA`acKcjG`uT~H$4NSD67!vrBU?m4|MUhi#=q$ zp}7(OI!+c(E5Je%vG`5Mi) wqhW7ZT%7w}}>Ovc2NAp!Z1Z9x=qg1iN{By+D1h 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 I{tNa$03U58uK)l5 literal 0 HcmV?d00001 diff --git a/2026/day-14/day-14-networking.md b/2026/day-14/day-14-networking.md new file mode 100644 index 0000000000..e69de29bb2 From a738b60703871f4497ba1537644d848aab213274 Mon Sep 17 00:00:00 2001 From: Dhananjay Lavate Date: Sun, 31 May 2026 11:08:22 +0100 Subject: [PATCH 02/35] Remove 'TrainWithShubham' from README --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index aff67ddb9c..8f5801efa0 100644 --- a/README.md +++ b/README.md @@ -127,4 +127,3 @@ One day at a time. One commit at a time. Happy Learning -**TrainWithShubham** From 7c0419c106b4ba4b78a3122d05f64b240b4669e2 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 11:14:09 +0100 Subject: [PATCH 03/35] osi --- 2026/day-14/{day-14-networking.md => practise.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 2026/day-14/{day-14-networking.md => practise.md} (100%) diff --git a/2026/day-14/day-14-networking.md b/2026/day-14/practise.md similarity index 100% rename from 2026/day-14/day-14-networking.md rename to 2026/day-14/practise.md From 19c75def597799eef06573487c40826f093d0bd1 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 11:18:44 +0100 Subject: [PATCH 04/35] Add day 14 networking notes --- 2026/day-14/practise.md | 216 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) diff --git a/2026/day-14/practise.md b/2026/day-14/practise.md index e69de29bb2..043b47eac3 100644 --- a/2026/day-14/practise.md +++ b/2026/day-14/practise.md @@ -0,0 +1,216 @@ +# Day 14 - Networking Basics and OSI Layer + +## 1. What a Network Actually Is? + +- A network is just: +- Two or more devices +- Connected via cables, Wi-Fi, or virtual links +- Exchanging data in packets + +- That data is broken into small chunks called packets, which travel independently and get reassembled at the destination. + +--- + +## 2. The OSI Model (Open Systems Interconnection Model) + +- The OSI Model (Open Systems Interconnection Model) is a conceptual framework used to understand how data travels from one computer to another over a network. +- It breaks the entire networking process into 7 separate layers, where each layer has a specific job. + +- Application +- Presentation +- Session +- Transport +- Network +- Data Link +- Physical + +# 🌐 What Happens When You Open Google (OSI Model Real-World Example) + +This document explains what happens behind the scenes when you type `www.google.com` in your browser and press Enter, mapped to the **OSI Model (7 Layers)**. + +--- + +# 🧠 Scenario Overview + +When you open Google, your computer performs multiple networking steps in milliseconds to fetch and display the webpage. + +--- + +# 🌐 Step-by-Step OSI Model Breakdown + +--- + +## 7. Application Layer (Layer 7) + +You interact with the browser (Chrome, Edge, Firefox). + +- You type: `www.google.com` +- Browser understands user request +- Creates an HTTP/HTTPS request + +👉 Meaning: +You are requesting a webpage. + +--- + +## 6. Presentation Layer (Layer 6) + +Data is prepared for secure transmission. + +- Data formatting happens +- Encryption is applied using **HTTPS (TLS/SSL)** + +👉 Meaning: +Data is encrypted so no one can read it during transmission. + +--- + +## 5. Session Layer (Layer 5) + +A communication session is established. + +- Connection between your computer and server is created +- Session is maintained while browsing + +👉 Meaning: +Keeps communication active until you close the browser/tab. + +--- + +## 4. Transport Layer (Layer 4) + +Ensures reliable data delivery. + +- Data is broken into segments +- TCP protocol is used (reliable delivery) +- Lost packets are retransmitted + +👉 Meaning: +Ensures all data arrives correctly and in order. + +--- + +## 3. Network Layer (Layer 3) + +Handles routing and IP addressing. + +- DNS converts `google.com` → IP address (e.g., 142.250.x.x) +- Routers decide best path for data packets + +👉 Meaning: +Finds the correct destination across the internet. + +--- + +## 2. Data Link Layer (Layer 2) + +Handles local network communication. + +- Data is framed +- MAC addresses are used +- Communication between device and router + +👉 Meaning: +Delivers data within your local network (Wi-Fi/Ethernet). + +--- + +## 1. Physical Layer (Layer 1) + +Actual transmission of data happens. + +- Data becomes electrical signals / radio waves / light signals +- Sent via cables, fiber optics, or Wi-Fi + +👉 Meaning: +Raw 0s and 1s travel through physical medium. + +--- + +# 🌍 Server Side (Google) + +The request reaches Google servers +(operated by :contentReference[oaicite:0]{index=0}) + +- Server processes your request +- Generates response (HTML, CSS, JS) +- Sends data back through the same layers in reverse + +--- + +# 🔁 Reverse Process (Receiving Data) + +When response comes back: + +1. Physical signals → bits +2. Data Link → frames processed +3. Network → routing removed +4. Transport → segments reassembled (TCP) +5. Session → connection maintained +6. Presentation → decrypted (HTTPS) +7. Application → browser renders page + +--- + +# 📦 Final Output + +Your browser displays: + +👉 Google homepage + +--- + +# 🧩 Simple Summary + +Opening Google involves: + +- Request creation (Application Layer) +- Encryption (Presentation Layer) +- Session establishment (Session Layer) +- Reliable transfer via TCP (Transport Layer) +- Routing via IP (Network Layer) +- Local delivery via MAC/Wi-Fi (Data Link Layer) +- Physical transmission via signals (Physical Layer) + +--- + +# 💡 One-Line Understanding + +> Opening Google is your computer sending a structured, encrypted request through 7 networking layers, and receiving a response that is rebuilt into a webpage. + +--- + +# 🚀 Key Takeaway + +The OSI model helps us understand: + +- How data travels across networks +- How different devices communicate +- How complex networking is broken into simple layers + +--- + + +--- + +# 💡 Key Insight + +> `curl https://www.google.com` is not “just a command” — it is a full OSI stack in action, from Application layer down to Physical transmission and back up again. + +--- + +# 🚀 Hands-on Checklist + +1. Identity Command + +> hostname -I + +- Output + +ubuntu@Kartik:~/LinuxForDevOps/day14$ hostname -I +172.27.145.12 + +- Observation + +- System IP address identified successfully. +- Used to verify local network configuration. From 28c78269e6ca118d1b7b617816a541baadee6e50 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 11:27:07 +0100 Subject: [PATCH 05/35] hostname -I --- 2026/day-14/practise.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/2026/day-14/practise.md b/2026/day-14/practise.md index 043b47eac3..6bc7e0567e 100644 --- a/2026/day-14/practise.md +++ b/2026/day-14/practise.md @@ -201,16 +201,17 @@ The OSI model helps us understand: # 🚀 Hands-on Checklist -1. Identity Command +# 1. Identity -> hostname -I +**Command** -- Output +```bash hostname -I + +**Output** ubuntu@Kartik:~/LinuxForDevOps/day14$ hostname -I 172.27.145.12 -- Observation - +**Observation** - System IP address identified successfully. - Used to verify local network configuration. From 276a401a2d99edeeafdce71709409673739cb2eb Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 11:27:57 +0100 Subject: [PATCH 06/35] hostname -I --- 2026/day-14/practise.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/2026/day-14/practise.md b/2026/day-14/practise.md index 6bc7e0567e..aa58f4bcb6 100644 --- a/2026/day-14/practise.md +++ b/2026/day-14/practise.md @@ -205,7 +205,9 @@ The OSI model helps us understand: **Command** -```bash hostname -I +```bash + +hostname -I **Output** From fb191cf6ca7a574f6a62ad341af3ecd16ba31fe3 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 11:29:44 +0100 Subject: [PATCH 07/35] hostname -I --- 2026/day-14/practise.md | 1 + 1 file changed, 1 insertion(+) diff --git a/2026/day-14/practise.md b/2026/day-14/practise.md index aa58f4bcb6..871939842a 100644 --- a/2026/day-14/practise.md +++ b/2026/day-14/practise.md @@ -202,6 +202,7 @@ The OSI model helps us understand: # 🚀 Hands-on Checklist # 1. Identity +```markdown **Command** From af32ee2d01192f56c7554cb8e166825a1d2aa51d Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 11:32:10 +0100 Subject: [PATCH 08/35] hostname -I --- 2026/day-14/practise.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/2026/day-14/practise.md b/2026/day-14/practise.md index 871939842a..d2396485e4 100644 --- a/2026/day-14/practise.md +++ b/2026/day-14/practise.md @@ -202,18 +202,19 @@ The OSI model helps us understand: # 🚀 Hands-on Checklist # 1. Identity -```markdown -**Command** - -```bash +**Command** +```bash hostname -I +``` **Output** +```text ubuntu@Kartik:~/LinuxForDevOps/day14$ hostname -I 172.27.145.12 +``` **Observation** - System IP address identified successfully. From 984d6e09b5913c65703d59025850e274ecffbf3f Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 12:00:05 +0100 Subject: [PATCH 09/35] networking commands --- 2026/day-14/practise.md | 136 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/2026/day-14/practise.md b/2026/day-14/practise.md index d2396485e4..e91b637d7f 100644 --- a/2026/day-14/practise.md +++ b/2026/day-14/practise.md @@ -203,7 +203,7 @@ The OSI model helps us understand: # 1. Identity -**Command** +**Command1** ```bash hostname -I @@ -219,3 +219,137 @@ ubuntu@Kartik:~/LinuxForDevOps/day14$ hostname -I **Observation** - System IP address identified successfully. - Used to verify local network configuration. + +**Command2** + +```bash +ip addr show + +``` +**Output** +```text + +ubuntu@Kartik:~/LinuxForDevOps/day14$ ip addr show +1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet 10.255.255.254/32 brd 10.255.255.254 scope global lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000 + link/ether 00:15:5d:dc:64:25 brd ff:ff:ff:ff:ff:ff + inet 172.27.145.12/20 brd 172.27.159.255 scope global eth0 + valid_lft forever preferred_lft forever + inet6 fe80::215:5dff:fedc:6425/64 scope link + valid_lft forever preferred_lft forever +``` + +**Observation** + +- This command shows: **All network interfaces + their IP addresses on your machine** + +1. Loopback Interface (lo) : ```1: lo: ``` + +2. Ethernet / Network Interface (eth0) : ```2: eth0: ``` This is your real network connection + +```ip addr show``` reveals how your machine identifies itself locally and on the network — including loopback (self), private IP (network), and MAC address (hardware identity). + + +# 2. Reachability + +**Command** + +```bash +ping -c 4 google.com +``` + +**Output** + +```text +ubuntu@Kartik:~/LinuxForDevOps/day14$ ping -c 4 google.com +PING google.com (142.251.30.139) 56(84) bytes of data. +64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=1 ttl=111 time=74.6 ms +64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=2 ttl=111 time=17.8 ms +64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=3 ttl=111 time=20.8 ms +64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=4 ttl=111 time=22.4 ms + +--- google.com ping statistics --- +4 packets transmitted, 4 received, 0% packet loss, time 3018ms +rtt min/avg/max/mdev = 17.764/33.900/74.587/23.550 ms +``` + +**Observation** +- You sent 4 packets & You received all 4 back +- 0% packet loss +- Avg Latency : 33.900 +- Average round-trip time is ~34 ms +- So network is stable (no loss) + + +# 3. Path Analysis + +**Command** + +```bash +traceroute google.com +``` + +**Output** + +```text +ubuntu@Kartik:~/LinuxForDevOps/day14$ traceroute google.com +traceroute to google.com (142.250.151.101), 30 hops max, 60 byte packets + 1 Kartik.mshome.net (172.27.144.1) 0.727 ms 0.733 ms 0.724 ms + 2 192.168.0.1 (192.168.0.1) 3.416 ms 3.355 ms 3.312 ms + 3 * * * + 4 80.255.198.222 (80.255.198.222) 16.828 ms 17.035 ms 16.994 ms + 5 * * * + 6 80.255.204.85 (80.255.204.85) 27.721 ms 15.202 ms 22.795 ms + 7 host-213-104-85.174.not-set-yet.virginmedia.net (213.104.85.174) 18.128 ms 17.153 ms 25.102 ms + 8 * * * + 9 216.239.41.240 (216.239.41.240) 26.259 ms 108.170.234.220 (108.170.234.220) 25.727 ms 209.85.252.180 (209.85.252.180) 26.840 ms +10 172.253.73.196 (172.253.73.196) 19.778 ms 172.253.64.176 (172.253.64.176) 24.029 ms 172.253.74.128 (172.253.74.128) 16.429 ms +11 * * * +12 * * * +13 * * * +14 * * * +15 * * * +16 * * * +17 * * st-in-f101.1e100.net (142.250.151.101) 21.054 ms +``` + +**Observation** +- All the hops (routers) your packet passes through to reach Google. +- Each line = one router in the path. + +``` +[You] + ↓ +172.27.144.1 (VM/Host) -- Your Machine + ↓ +192.168.0.1 (Router) -- Your Network IP(Virgin media wifi ip) + ↓ +ISP Backbone (Virgin Media) + ↓ +Internet Routers (hidden hops) + ↓ +Google Backbone + ↓ +Google Server ✅ + +``` +**Why * * * happens** + +**Routers may ignore traceroute because:** + +- Firewall blocks ICMP replies +- Security hardening +- Rate limiting +- Cloud provider protection +👉 It does NOT mean failure + +**Key Takeaway** + +```traceroute``` shows the internet path, not just the destination — revealing how your request travels through routers, ISPs, and cloud backbone networks before reaching Google. \ No newline at end of file From bfa5ff2ffeed1b2ad4d98b710585625edd90fe8b Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 12:18:25 +0100 Subject: [PATCH 10/35] port --- 2026/day-14/practise.md | 68 ++++++++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/2026/day-14/practise.md b/2026/day-14/practise.md index e91b637d7f..219e59d2f3 100644 --- a/2026/day-14/practise.md +++ b/2026/day-14/practise.md @@ -250,12 +250,9 @@ ubuntu@Kartik:~/LinuxForDevOps/day14$ ip addr show - This command shows: **All network interfaces + their IP addresses on your machine** -1. Loopback Interface (lo) : ```1: lo: ``` - -2. Ethernet / Network Interface (eth0) : ```2: eth0: ``` This is your real network connection - -```ip addr show``` reveals how your machine identifies itself locally and on the network — including loopback (self), private IP (network), and MAC address (hardware identity). - +- Loopback Interface (lo) : ```1: lo: ``` +- Ethernet / Network Interface (eth0) : ```2: eth0: ``` This is your real network connection +- ```ip addr show``` reveals how your machine identifies itself locally and on the network — including loopback (self), private IP (network), and MAC address (hardware identity). # 2. Reachability @@ -279,7 +276,6 @@ PING google.com (142.251.30.139) 56(84) bytes of data. 4 packets transmitted, 4 received, 0% packet loss, time 3018ms rtt min/avg/max/mdev = 17.764/33.900/74.587/23.550 ms ``` - **Observation** - You sent 4 packets & You received all 4 back - 0% packet loss @@ -287,7 +283,6 @@ rtt min/avg/max/mdev = 17.764/33.900/74.587/23.550 ms - Average round-trip time is ~34 ms - So network is stable (no loss) - # 3. Path Analysis **Command** @@ -295,7 +290,6 @@ rtt min/avg/max/mdev = 17.764/33.900/74.587/23.550 ms ```bash traceroute google.com ``` - **Output** ```text @@ -319,11 +313,18 @@ traceroute to google.com (142.250.151.101), 30 hops max, 60 byte packets 16 * * * 17 * * st-in-f101.1e100.net (142.250.151.101) 21.054 ms ``` - **Observation** + - All the hops (routers) your packet passes through to reach Google. - Each line = one router in the path. +🧭 Total hops observed : *17* : ✔ (From hop 1 → hop 17 where Google server responded) +⚠️ Timeouts observed: Hop 3, 5, 8, 11, 12, 13, 14, 15, 16 + +> 🧠 Meaning of these timeouts : > Routers are not replying to ICMP traceroute packets > NOT a failure > Very common in ISP + Google backbone networks + +**🧠 Your Full Route** + ``` [You] ↓ @@ -352,4 +353,49 @@ Google Server ✅ **Key Takeaway** -```traceroute``` shows the internet path, not just the destination — revealing how your request travels through routers, ISPs, and cloud backbone networks before reaching Google. \ No newline at end of file +```traceroute``` shows the internet path, not just the destination — revealing how your request travels through routers, ISPs, and cloud backbone networks before reaching Google. + +# 4. Listening Ports + +**It shows what your machine is actually “listening” to.** + +**Command** + +``ss -tulpn`` + +🔍 What ss -tulpn means + +ss = socket statistics + +**It shows:** +- Open ports +- Listening services +- TCP/UDP connections +- Which processes are using them + +```text + +ubuntu@Kartik:~/LinuxForDevOps/day14$ ss -tulpn +Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process +udp UNCONN 0 0 127.0.0.54:53 0.0.0.0:* +udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* +udp UNCONN 0 0 10.255.255.254:53 0.0.0.0:* +udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* +udp UNCONN 0 0 [::1]:323 [::]:* +tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* +tcp LISTEN 0 4096 127.0.0.54:53 0.0.0.0:* +tcp LISTEN 0 1000 10.255.255.254:53 0.0.0.0:* +tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* +tcp LISTEN 0 511 [::]:80 [::]:* + +``` + +**🧠 Your system overview** + +**You currently have:** +- DNS services running (port 53) +- Local system resolver active +- Web server listening on port 80 +- Loopback + private network bindings + + From c0772516c91a81ce1663469371d2a80c9655318f Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 12:45:47 +0100 Subject: [PATCH 11/35] DNS --- 2026/day-14/practise.md | 71 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/2026/day-14/practise.md b/2026/day-14/practise.md index 219e59d2f3..65d15ef504 100644 --- a/2026/day-14/practise.md +++ b/2026/day-14/practise.md @@ -321,7 +321,10 @@ traceroute to google.com (142.250.151.101), 30 hops max, 60 byte packets 🧭 Total hops observed : *17* : ✔ (From hop 1 → hop 17 where Google server responded) ⚠️ Timeouts observed: Hop 3, 5, 8, 11, 12, 13, 14, 15, 16 -> 🧠 Meaning of these timeouts : > Routers are not replying to ICMP traceroute packets > NOT a failure > Very common in ISP + Google backbone networks +**🧠 Meaning of these timeouts : ** +- Routers are not replying to ICMP traceroute packets +- NOT a failure +- Very common in ISP + Google backbone networks **🧠 Your Full Route** @@ -363,9 +366,9 @@ Google Server ✅ ``ss -tulpn`` -🔍 What ss -tulpn means +🔍 What ```ss -tulpn``` means -ss = socket statistics +```ss = socket statistics``` **It shows:** - Open ports @@ -398,4 +401,66 @@ tcp LISTEN 0 511 - Web server listening on port 80 - Loopback + private network bindings +# 5. Name Resolution +```dig google.com``` + +**This is a perfect real-world DNS resolution trace** + +🌐 What ```dig google.com``` did + +**dig = DNS lookup tool** + +It asked: **What are the IP addresses for google.com?** + +**Output** + +```text +ubuntu@Kartik:~/LinuxForDevOps/day14$ dig google.com + +; <<>> DiG 9.18.39-0ubuntu0.24.04.5-Ubuntu <<>> google.com +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11112 +;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1 + +;; OPT PSEUDOSECTION: +; EDNS: version: 0, flags:; udp: 512 +;; QUESTION SECTION: +;google.com. IN A + +;; ANSWER SECTION: +google.com. 63 IN A 142.251.30.101 +google.com. 63 IN A 142.251.30.139 +google.com. 63 IN A 142.251.30.138 +google.com. 63 IN A 142.251.30.100 +google.com. 63 IN A 142.251.30.102 +google.com. 63 IN A 142.251.30.113 + +;; Query time: 31 msec +;; SERVER: 10.255.255.254#53(10.255.255.254) (UDP) +;; WHEN: Sun May 31 12:33:33 BST 2026 +;; MSG SIZE rcvd: 135 +``` +**🌐 Resolved IPs ^** + +``` +142.251.30.101 +142.251.30.139 +142.251.30.138 +142.251.30.100 +142.251.30.102 +142.251.30.113 +``` + +**🧠 Why multiple IPs?** + +Because Google uses: + +- 🔥 Load Balancing : Traffic distributed across servers + +- 🌍 Geo-routing : You connect to nearest data center + +⚡ High availability : If one server fails, others respond + +👉 This is why Google never goes down easily \ No newline at end of file From 87d3db7b7b5a921923941e0abb0a5ba50d95d869 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 12:50:33 +0100 Subject: [PATCH 12/35] dns2 --- 2026/day-14/practise.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/2026/day-14/practise.md b/2026/day-14/practise.md index 65d15ef504..935a15ab7b 100644 --- a/2026/day-14/practise.md +++ b/2026/day-14/practise.md @@ -13,8 +13,9 @@ ## 2. The OSI Model (Open Systems Interconnection Model) -- The OSI Model (Open Systems Interconnection Model) is a conceptual framework used to understand how data travels from one computer to another over a network. -- It breaks the entire networking process into 7 separate layers, where each layer has a specific job. +**The OSI Model (Open Systems Interconnection Model) is a conceptual framework used to understand how data travels from one computer to another over a network** + +**It breaks the entire networking process into 7 separate layers, where each layer has a specific job.** - Application - Presentation @@ -318,10 +319,12 @@ traceroute to google.com (142.250.151.101), 30 hops max, 60 byte packets - All the hops (routers) your packet passes through to reach Google. - Each line = one router in the path. -🧭 Total hops observed : *17* : ✔ (From hop 1 → hop 17 where Google server responded) -⚠️ Timeouts observed: Hop 3, 5, 8, 11, 12, 13, 14, 15, 16 +**🧭 Total hops observed** : **17** : ```From hop 1 → hop 17``` --> where Google server responded + +**⚠️ Timeouts observed:** ```Hop 3, 5, 8, 11, 12, 13, 14, 15, 16``` + +**🧠 Meaning of these timeouts :** -**🧠 Meaning of these timeouts : ** - Routers are not replying to ICMP traceroute packets - NOT a failure - Very common in ISP + Google backbone networks @@ -457,9 +460,9 @@ google.com. 63 IN A 142.251.30.113 Because Google uses: -- 🔥 Load Balancing : Traffic distributed across servers +🔥 Load Balancing : Traffic distributed across servers -- 🌍 Geo-routing : You connect to nearest data center +🌍 Geo-routing : You connect to nearest data center ⚡ High availability : If one server fails, others respond From 5d297b6e4fd416845efc5cd21eba9634a7f6c6dc Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 13:21:33 +0100 Subject: [PATCH 13/35] networking --- 2026/day-14/practise.md | 215 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 214 insertions(+), 1 deletion(-) diff --git a/2026/day-14/practise.md b/2026/day-14/practise.md index 935a15ab7b..402612e02e 100644 --- a/2026/day-14/practise.md +++ b/2026/day-14/practise.md @@ -466,4 +466,217 @@ Because Google uses: ⚡ High availability : If one server fails, others respond -👉 This is why Google never goes down easily \ No newline at end of file +👉 This is why Google never goes down easily + +# 6. HTTP Check + +```curl -I https://google.com``` + +🌐 What this command does + +```curl -I = send HTTP HEAD request (headers only)``` + +**You are asking: Give me only metadata about google.com, HEADER DETAILS Only not the full page.** + +**Output** + +``` +ubuntu@Kartik:~/LinuxForDevOps/day14$ curl -I https://google.com +HTTP/2 301 +location: https://www.google.com/ +content-type: text/html; charset=UTF-8 +content-security-policy-report-only: object-src 'none';base-uri 'self';script-src 'nonce-KIi4ninNsWjFZ_OPAIpAIw' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp +date: Sun, 31 May 2026 11:51:42 GMT +expires: Tue, 30 Jun 2026 11:51:42 GMT +cache-control: public, max-age=2592000 +server: gws +content-length: 220 +x-xss-protection: 0 +x-frame-options: SAMEORIGIN +alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 +``` + +**🔐 1. Protocol Used** + +```HTTP/2 301``` + +🧠 Meaning: + +- HTTP/2 → modern, multiplexed web protocol +- 301 → Permanent Redirect + +# 7. Connections Snapshot + +**Command** + +```netstat -an | head``` + +``` +netstat = network statistics +-a = all connections +-n = numeric (no DNS resolution) +``` + +**netstat shows your machine is running DNS resolver services on port 53 and a web server listening on port 80 across IPv4 and IPv6 interfaces.** + +**Output** + +**This output is basically a snapshot of all active network sockets on your machine** + +``` +ubuntu@Kartik:~/LinuxForDevOps/day14$ netstat -an | head +Active Internet connections (servers and established) +Proto Recv-Q Send-Q Local Address Foreign Address State +tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN +tcp 0 0 127.0.0.54:53 0.0.0.0:* LISTEN +tcp 0 0 10.255.255.254:53 0.0.0.0:* LISTEN +tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN +tcp 0 0 127.0.0.1:50638 127.0.0.1:80 ESTABLISHED +tcp 0 0 127.0.0.1:50650 127.0.0.1:80 ESTABLISHED +tcp 0 0 127.0.0.1:80 127.0.0.1:50638 ESTABLISHED +tcp 0 0 127.0.0.1:80 127.0.0.1:50650 ESTABLISHED + +``` +1. ESTABLISHED connections: 4 +2. LISTEN connections: 4 + +--- + +# 8. Mini Task: Port Probe & Interpret + +**Task 1 : Identify one listening port from ss -tulpn (e.g., SSH on 22 or a local web app).** + +``` +ubuntu@Kartik:~/LinuxForDevOps/day14$ ss -tulpn +Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process +udp UNCONN 0 0 127.0.0.54:53 0.0.0.0:* +udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* +udp UNCONN 0 0 10.255.255.254:53 0.0.0.0:* +udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* +udp UNCONN 0 0 [::1]:323 [::]:* +tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* +tcp LISTEN 0 4096 127.0.0.54:53 0.0.0.0:* +tcp LISTEN 0 1000 10.255.255.254:53 0.0.0.0:* +tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* +tcp LISTEN 0 511 [::]:80 [::]:* +``` + +**Listening Service Identified** + +- Service: DNS Resolver (systemd-resolved) + Web Server + +- Ports: + +1. Port 53 → DNS infrastructure (critical for internet access) +2. Port 80 → Web traffic (HTTP server) + +**Task 2 : From the same machine, test it: ```nc -zv localhost``` (or curl -I http://localhost:).** + +**Command** + +```nc -zv localhost 80``` + +**Output** + +``` +ubuntu@Kartik:~/LinuxForDevOps/day14$ nc -zv localhost 80 +Connection to localhost (127.0.0.1) 80 port [tcp/http] succeeded! +``` + +**OR** + +**Command** + +```curl -I http://localhost:80``` + +**Output** + +```ubuntu@Kartik:~/LinuxForDevOps/day14$ curl -I http://localhost:80 +HTTP/1.1 200 OK +Server: nginx/1.24.0 (Ubuntu) +Date: Sun, 31 May 2026 12:17:18 GMT +Content-Type: text/html +Content-Length: 615 +Last-Modified: Thu, 21 May 2026 06:26:26 GMT +Connection: keep-alive +ETag: "6a0ea592-267" +Accept-Ranges: bytes +``` + +**Interpretation** + +Reachable: Yes / No +If not reachable, next checks: +Verify service status (systemctl status ) +Check firewall rules (ufw status, iptables -L) +Review application logs + + +# 🧠 Networking Reflection (DevOps Troubleshooting Guide) + +--- + +# ⚡ 1. Which command gives you the fastest signal when something is broken? + +## 📡 `ping` +- Quickly confirms basic network connectivity +- Detects packet loss and latency issues + +👉 Use when: +- You suspect network is down +- You want quick connectivity check + +--- + +## 🌐 `curl -I` +- Checks if a web service is responding +- Verifies HTTP/HTTPS status without downloading full content + +👉 Use when: +- Website is slow or not loading +- You want to check server availability + +--- + +# 🧩 2. What layer would you inspect if DNS fails? + +## 🌍 Primary Layer: +- **Application Layer (DNS Service)** + +--- + +## 🔍 Next checks: +- Transport Layer → UDP/TCP port 53 +- Internet Layer → IP connectivity + +👉 Meaning: +Start from DNS resolver, then move downward in OSI stack if needed. + +--- + +# 🚨 3. What layer would you inspect if HTTP 500 appears? + +## 🌐 Layer: +- **Application Layer** + +--- + +## 🔍 What to check: +- Web server logs (nginx / apache) +- Backend application logs +- Database connectivity issues +- API/service dependencies + +👉 Meaning: +HTTP 500 = server-side failure, not network issue + +--- + +# 🛠️ 4. Two follow-up checks during a real incident + +--- + +## 🔎 Check active listening services + +```bash id="cmd1" +ss -tulpn \ No newline at end of file From ec38c0e9a9f27b8d70abb77224be690015013ac6 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 13:25:16 +0100 Subject: [PATCH 14/35] networking --- 2026/day-14/practise.md | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/2026/day-14/practise.md b/2026/day-14/practise.md index 402612e02e..e84496f202 100644 --- a/2026/day-14/practise.md +++ b/2026/day-14/practise.md @@ -1,13 +1,27 @@ # Day 14 - Networking Basics and OSI Layer -## 1. What a Network Actually Is? +# 🌐 1. What a Network Actually Is -- A network is just: -- Two or more devices -- Connected via cables, Wi-Fi, or virtual links -- Exchanging data in packets +A network is simply: -- That data is broken into small chunks called packets, which travel independently and get reassembled at the destination. +> 🧠 A group of devices connected so they can talk to each other. + +--- + +## 📌 Examples: + +- Your laptop ↔ router +- Your phone ↔ Wi-Fi +- Servers ↔ other servers +- Your device ↔ Google + +--- + +## 🔗 They can be connected using: + +- 🔌 Cables (Ethernet) +- 📶 Wi-Fi (wireless signals) +- ☁️ Virtual links (cloud networks like AWS) --- From 2c21241fabdb7db24e0c194c8c84573b292ad280 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 13:26:26 +0100 Subject: [PATCH 15/35] rename --- 2026/day-14/{practise.md => day-14-networking.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 2026/day-14/{practise.md => day-14-networking.md} (100%) diff --git a/2026/day-14/practise.md b/2026/day-14/day-14-networking.md similarity index 100% rename from 2026/day-14/practise.md rename to 2026/day-14/day-14-networking.md From 7bd643100e14fd9ba475ec3dff4ee975803baf87 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 13:33:13 +0100 Subject: [PATCH 16/35] hands-on --- 2026/day-14/day-14-networking-hands-on.md | 480 +++++++++++++++++++++ 2026/day-14/day-14-networking.md | 483 +--------------------- 2 files changed, 481 insertions(+), 482 deletions(-) create mode 100644 2026/day-14/day-14-networking-hands-on.md diff --git a/2026/day-14/day-14-networking-hands-on.md b/2026/day-14/day-14-networking-hands-on.md new file mode 100644 index 0000000000..2e89543459 --- /dev/null +++ b/2026/day-14/day-14-networking-hands-on.md @@ -0,0 +1,480 @@ +# Day 14 - Networking Basics 🚀 Hands-on Checklist + +# 1. Identity + +**Command1** + +```bash +hostname -I +``` + +**Output** + +```text +ubuntu@Kartik:~/LinuxForDevOps/day14$ hostname -I +172.27.145.12 +``` + +**Observation** +- System IP address identified successfully. +- Used to verify local network configuration. + +**Command2** + +```bash +ip addr show + +``` +**Output** +```text + +ubuntu@Kartik:~/LinuxForDevOps/day14$ ip addr show +1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet 10.255.255.254/32 brd 10.255.255.254 scope global lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000 + link/ether 00:15:5d:dc:64:25 brd ff:ff:ff:ff:ff:ff + inet 172.27.145.12/20 brd 172.27.159.255 scope global eth0 + valid_lft forever preferred_lft forever + inet6 fe80::215:5dff:fedc:6425/64 scope link + valid_lft forever preferred_lft forever +``` + +**Observation** + +- This command shows: **All network interfaces + their IP addresses on your machine** + +- Loopback Interface (lo) : ```1: lo: ``` +- Ethernet / Network Interface (eth0) : ```2: eth0: ``` This is your real network connection +- ```ip addr show``` reveals how your machine identifies itself locally and on the network — including loopback (self), private IP (network), and MAC address (hardware identity). + +# 2. Reachability + +**Command** + +```bash +ping -c 4 google.com +``` + +**Output** + +```text +ubuntu@Kartik:~/LinuxForDevOps/day14$ ping -c 4 google.com +PING google.com (142.251.30.139) 56(84) bytes of data. +64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=1 ttl=111 time=74.6 ms +64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=2 ttl=111 time=17.8 ms +64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=3 ttl=111 time=20.8 ms +64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=4 ttl=111 time=22.4 ms + +--- google.com ping statistics --- +4 packets transmitted, 4 received, 0% packet loss, time 3018ms +rtt min/avg/max/mdev = 17.764/33.900/74.587/23.550 ms +``` +**Observation** +- You sent 4 packets & You received all 4 back +- 0% packet loss +- Avg Latency : 33.900 +- Average round-trip time is ~34 ms +- So network is stable (no loss) + +# 3. Path Analysis + +**Command** + +```bash +traceroute google.com +``` +**Output** + +```text +ubuntu@Kartik:~/LinuxForDevOps/day14$ traceroute google.com +traceroute to google.com (142.250.151.101), 30 hops max, 60 byte packets + 1 Kartik.mshome.net (172.27.144.1) 0.727 ms 0.733 ms 0.724 ms + 2 192.168.0.1 (192.168.0.1) 3.416 ms 3.355 ms 3.312 ms + 3 * * * + 4 80.255.198.222 (80.255.198.222) 16.828 ms 17.035 ms 16.994 ms + 5 * * * + 6 80.255.204.85 (80.255.204.85) 27.721 ms 15.202 ms 22.795 ms + 7 host-213-104-85.174.not-set-yet.virginmedia.net (213.104.85.174) 18.128 ms 17.153 ms 25.102 ms + 8 * * * + 9 216.239.41.240 (216.239.41.240) 26.259 ms 108.170.234.220 (108.170.234.220) 25.727 ms 209.85.252.180 (209.85.252.180) 26.840 ms +10 172.253.73.196 (172.253.73.196) 19.778 ms 172.253.64.176 (172.253.64.176) 24.029 ms 172.253.74.128 (172.253.74.128) 16.429 ms +11 * * * +12 * * * +13 * * * +14 * * * +15 * * * +16 * * * +17 * * st-in-f101.1e100.net (142.250.151.101) 21.054 ms +``` +**Observation** + +- All the hops (routers) your packet passes through to reach Google. +- Each line = one router in the path. + +**🧭 Total hops observed** : **17** : ```From hop 1 → hop 17``` --> where Google server responded + +**⚠️ Timeouts observed:** ```Hop 3, 5, 8, 11, 12, 13, 14, 15, 16``` + +**🧠 Meaning of these timeouts :** + +- Routers are not replying to ICMP traceroute packets +- NOT a failure +- Very common in ISP + Google backbone networks + +**🧠 Your Full Route** + +``` +[You] + ↓ +172.27.144.1 (VM/Host) -- Your Machine + ↓ +192.168.0.1 (Router) -- Your Network IP(Virgin media wifi ip) + ↓ +ISP Backbone (Virgin Media) + ↓ +Internet Routers (hidden hops) + ↓ +Google Backbone + ↓ +Google Server ✅ + +``` +**Why * * * happens** + +**Routers may ignore traceroute because:** + +- Firewall blocks ICMP replies +- Security hardening +- Rate limiting +- Cloud provider protection +👉 It does NOT mean failure + +**Key Takeaway** + +```traceroute``` shows the internet path, not just the destination — revealing how your request travels through routers, ISPs, and cloud backbone networks before reaching Google. + +# 4. Listening Ports + +**It shows what your machine is actually “listening” to.** + +**Command** + +``ss -tulpn`` + +🔍 What ```ss -tulpn``` means + +```ss = socket statistics``` + +**It shows:** +- Open ports +- Listening services +- TCP/UDP connections +- Which processes are using them + +```text + +ubuntu@Kartik:~/LinuxForDevOps/day14$ ss -tulpn +Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process +udp UNCONN 0 0 127.0.0.54:53 0.0.0.0:* +udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* +udp UNCONN 0 0 10.255.255.254:53 0.0.0.0:* +udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* +udp UNCONN 0 0 [::1]:323 [::]:* +tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* +tcp LISTEN 0 4096 127.0.0.54:53 0.0.0.0:* +tcp LISTEN 0 1000 10.255.255.254:53 0.0.0.0:* +tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* +tcp LISTEN 0 511 [::]:80 [::]:* + +``` + +**🧠 Your system overview** + +**You currently have:** +- DNS services running (port 53) +- Local system resolver active +- Web server listening on port 80 +- Loopback + private network bindings + +# 5. Name Resolution + +```dig google.com``` + +**This is a perfect real-world DNS resolution trace** + +🌐 What ```dig google.com``` did + +**dig = DNS lookup tool** + +It asked: **What are the IP addresses for google.com?** + +**Output** + +```text +ubuntu@Kartik:~/LinuxForDevOps/day14$ dig google.com + +; <<>> DiG 9.18.39-0ubuntu0.24.04.5-Ubuntu <<>> google.com +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11112 +;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1 + +;; OPT PSEUDOSECTION: +; EDNS: version: 0, flags:; udp: 512 +;; QUESTION SECTION: +;google.com. IN A + +;; ANSWER SECTION: +google.com. 63 IN A 142.251.30.101 +google.com. 63 IN A 142.251.30.139 +google.com. 63 IN A 142.251.30.138 +google.com. 63 IN A 142.251.30.100 +google.com. 63 IN A 142.251.30.102 +google.com. 63 IN A 142.251.30.113 + +;; Query time: 31 msec +;; SERVER: 10.255.255.254#53(10.255.255.254) (UDP) +;; WHEN: Sun May 31 12:33:33 BST 2026 +;; MSG SIZE rcvd: 135 +``` +**🌐 Resolved IPs ^** + +``` +142.251.30.101 +142.251.30.139 +142.251.30.138 +142.251.30.100 +142.251.30.102 +142.251.30.113 +``` + +**🧠 Why multiple IPs?** + +Because Google uses: + +🔥 Load Balancing : Traffic distributed across servers + +🌍 Geo-routing : You connect to nearest data center + +⚡ High availability : If one server fails, others respond + +👉 This is why Google never goes down easily + +# 6. HTTP Check + +```curl -I https://google.com``` + +🌐 What this command does + +```curl -I = send HTTP HEAD request (headers only)``` + +**You are asking: Give me only metadata about google.com, HEADER DETAILS Only not the full page.** + +**Output** + +``` +ubuntu@Kartik:~/LinuxForDevOps/day14$ curl -I https://google.com +HTTP/2 301 +location: https://www.google.com/ +content-type: text/html; charset=UTF-8 +content-security-policy-report-only: object-src 'none';base-uri 'self';script-src 'nonce-KIi4ninNsWjFZ_OPAIpAIw' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp +date: Sun, 31 May 2026 11:51:42 GMT +expires: Tue, 30 Jun 2026 11:51:42 GMT +cache-control: public, max-age=2592000 +server: gws +content-length: 220 +x-xss-protection: 0 +x-frame-options: SAMEORIGIN +alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 +``` + +**🔐 1. Protocol Used** + +```HTTP/2 301``` + +🧠 Meaning: + +- HTTP/2 → modern, multiplexed web protocol +- 301 → Permanent Redirect + +# 7. Connections Snapshot + +**Command** + +```netstat -an | head``` + +``` +netstat = network statistics +-a = all connections +-n = numeric (no DNS resolution) +``` + +**netstat shows your machine is running DNS resolver services on port 53 and a web server listening on port 80 across IPv4 and IPv6 interfaces.** + +**Output** + +**This output is basically a snapshot of all active network sockets on your machine** + +``` +ubuntu@Kartik:~/LinuxForDevOps/day14$ netstat -an | head +Active Internet connections (servers and established) +Proto Recv-Q Send-Q Local Address Foreign Address State +tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN +tcp 0 0 127.0.0.54:53 0.0.0.0:* LISTEN +tcp 0 0 10.255.255.254:53 0.0.0.0:* LISTEN +tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN +tcp 0 0 127.0.0.1:50638 127.0.0.1:80 ESTABLISHED +tcp 0 0 127.0.0.1:50650 127.0.0.1:80 ESTABLISHED +tcp 0 0 127.0.0.1:80 127.0.0.1:50638 ESTABLISHED +tcp 0 0 127.0.0.1:80 127.0.0.1:50650 ESTABLISHED + +``` +1. ESTABLISHED connections: 4 +2. LISTEN connections: 4 + +--- + +# 8. Mini Task: Port Probe & Interpret + +**Task 1 : Identify one listening port from ss -tulpn (e.g., SSH on 22 or a local web app).** + +``` +ubuntu@Kartik:~/LinuxForDevOps/day14$ ss -tulpn +Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process +udp UNCONN 0 0 127.0.0.54:53 0.0.0.0:* +udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* +udp UNCONN 0 0 10.255.255.254:53 0.0.0.0:* +udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* +udp UNCONN 0 0 [::1]:323 [::]:* +tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* +tcp LISTEN 0 4096 127.0.0.54:53 0.0.0.0:* +tcp LISTEN 0 1000 10.255.255.254:53 0.0.0.0:* +tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* +tcp LISTEN 0 511 [::]:80 [::]:* +``` + +**Listening Service Identified** + +- Service: DNS Resolver (systemd-resolved) + Web Server + +- Ports: + +1. Port 53 → DNS infrastructure (critical for internet access) +2. Port 80 → Web traffic (HTTP server) + +**Task 2 : From the same machine, test it: ```nc -zv localhost``` (or curl -I http://localhost:).** + +**Command** + +```nc -zv localhost 80``` + +**Output** + +``` +ubuntu@Kartik:~/LinuxForDevOps/day14$ nc -zv localhost 80 +Connection to localhost (127.0.0.1) 80 port [tcp/http] succeeded! +``` + +**OR** + +**Command** + +```curl -I http://localhost:80``` + +**Output** + +```ubuntu@Kartik:~/LinuxForDevOps/day14$ curl -I http://localhost:80 +HTTP/1.1 200 OK +Server: nginx/1.24.0 (Ubuntu) +Date: Sun, 31 May 2026 12:17:18 GMT +Content-Type: text/html +Content-Length: 615 +Last-Modified: Thu, 21 May 2026 06:26:26 GMT +Connection: keep-alive +ETag: "6a0ea592-267" +Accept-Ranges: bytes +``` + +**Interpretation** + +Reachable: Yes / No +If not reachable, next checks: +Verify service status (systemctl status ) +Check firewall rules (ufw status, iptables -L) +Review application logs + + +# 🧠 Networking Reflection (DevOps Troubleshooting Guide) + +--- + +# ⚡ 1. Which command gives you the fastest signal when something is broken? + +## 📡 `ping` +- Quickly confirms basic network connectivity +- Detects packet loss and latency issues + +👉 Use when: +- You suspect network is down +- You want quick connectivity check + +--- + +## 🌐 `curl -I` +- Checks if a web service is responding +- Verifies HTTP/HTTPS status without downloading full content + +👉 Use when: +- Website is slow or not loading +- You want to check server availability + +--- + +# 🧩 2. What layer would you inspect if DNS fails? + +## 🌍 Primary Layer: +- **Application Layer (DNS Service)** + +--- + +## 🔍 Next checks: +- Transport Layer → UDP/TCP port 53 +- Internet Layer → IP connectivity + +👉 Meaning: +Start from DNS resolver, then move downward in OSI stack if needed. + +--- + +# 🚨 3. What layer would you inspect if HTTP 500 appears? + +## 🌐 Layer: +- **Application Layer** + +--- + +## 🔍 What to check: +- Web server logs (nginx / apache) +- Backend application logs +- Database connectivity issues +- API/service dependencies + +👉 Meaning: +HTTP 500 = server-side failure, not network issue + +--- + +# 🛠️ 4. Two follow-up checks during a real incident + +--- + +## 🔎 Check active listening services + +```bash id="cmd1" +ss -tulpn \ No newline at end of file diff --git a/2026/day-14/day-14-networking.md b/2026/day-14/day-14-networking.md index e84496f202..5399aa6c78 100644 --- a/2026/day-14/day-14-networking.md +++ b/2026/day-14/day-14-networking.md @@ -212,485 +212,4 @@ The OSI model helps us understand: > `curl https://www.google.com` is not “just a command” — it is a full OSI stack in action, from Application layer down to Physical transmission and back up again. ---- - -# 🚀 Hands-on Checklist - -# 1. Identity - -**Command1** - -```bash -hostname -I -``` - -**Output** - -```text -ubuntu@Kartik:~/LinuxForDevOps/day14$ hostname -I -172.27.145.12 -``` - -**Observation** -- System IP address identified successfully. -- Used to verify local network configuration. - -**Command2** - -```bash -ip addr show - -``` -**Output** -```text - -ubuntu@Kartik:~/LinuxForDevOps/day14$ ip addr show -1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 - link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 - inet 127.0.0.1/8 scope host lo - valid_lft forever preferred_lft forever - inet 10.255.255.254/32 brd 10.255.255.254 scope global lo - valid_lft forever preferred_lft forever - inet6 ::1/128 scope host - valid_lft forever preferred_lft forever -2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000 - link/ether 00:15:5d:dc:64:25 brd ff:ff:ff:ff:ff:ff - inet 172.27.145.12/20 brd 172.27.159.255 scope global eth0 - valid_lft forever preferred_lft forever - inet6 fe80::215:5dff:fedc:6425/64 scope link - valid_lft forever preferred_lft forever -``` - -**Observation** - -- This command shows: **All network interfaces + their IP addresses on your machine** - -- Loopback Interface (lo) : ```1: lo: ``` -- Ethernet / Network Interface (eth0) : ```2: eth0: ``` This is your real network connection -- ```ip addr show``` reveals how your machine identifies itself locally and on the network — including loopback (self), private IP (network), and MAC address (hardware identity). - -# 2. Reachability - -**Command** - -```bash -ping -c 4 google.com -``` - -**Output** - -```text -ubuntu@Kartik:~/LinuxForDevOps/day14$ ping -c 4 google.com -PING google.com (142.251.30.139) 56(84) bytes of data. -64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=1 ttl=111 time=74.6 ms -64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=2 ttl=111 time=17.8 ms -64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=3 ttl=111 time=20.8 ms -64 bytes from sv-in-f139.1e100.net (142.251.30.139): icmp_seq=4 ttl=111 time=22.4 ms - ---- google.com ping statistics --- -4 packets transmitted, 4 received, 0% packet loss, time 3018ms -rtt min/avg/max/mdev = 17.764/33.900/74.587/23.550 ms -``` -**Observation** -- You sent 4 packets & You received all 4 back -- 0% packet loss -- Avg Latency : 33.900 -- Average round-trip time is ~34 ms -- So network is stable (no loss) - -# 3. Path Analysis - -**Command** - -```bash -traceroute google.com -``` -**Output** - -```text -ubuntu@Kartik:~/LinuxForDevOps/day14$ traceroute google.com -traceroute to google.com (142.250.151.101), 30 hops max, 60 byte packets - 1 Kartik.mshome.net (172.27.144.1) 0.727 ms 0.733 ms 0.724 ms - 2 192.168.0.1 (192.168.0.1) 3.416 ms 3.355 ms 3.312 ms - 3 * * * - 4 80.255.198.222 (80.255.198.222) 16.828 ms 17.035 ms 16.994 ms - 5 * * * - 6 80.255.204.85 (80.255.204.85) 27.721 ms 15.202 ms 22.795 ms - 7 host-213-104-85.174.not-set-yet.virginmedia.net (213.104.85.174) 18.128 ms 17.153 ms 25.102 ms - 8 * * * - 9 216.239.41.240 (216.239.41.240) 26.259 ms 108.170.234.220 (108.170.234.220) 25.727 ms 209.85.252.180 (209.85.252.180) 26.840 ms -10 172.253.73.196 (172.253.73.196) 19.778 ms 172.253.64.176 (172.253.64.176) 24.029 ms 172.253.74.128 (172.253.74.128) 16.429 ms -11 * * * -12 * * * -13 * * * -14 * * * -15 * * * -16 * * * -17 * * st-in-f101.1e100.net (142.250.151.101) 21.054 ms -``` -**Observation** - -- All the hops (routers) your packet passes through to reach Google. -- Each line = one router in the path. - -**🧭 Total hops observed** : **17** : ```From hop 1 → hop 17``` --> where Google server responded - -**⚠️ Timeouts observed:** ```Hop 3, 5, 8, 11, 12, 13, 14, 15, 16``` - -**🧠 Meaning of these timeouts :** - -- Routers are not replying to ICMP traceroute packets -- NOT a failure -- Very common in ISP + Google backbone networks - -**🧠 Your Full Route** - -``` -[You] - ↓ -172.27.144.1 (VM/Host) -- Your Machine - ↓ -192.168.0.1 (Router) -- Your Network IP(Virgin media wifi ip) - ↓ -ISP Backbone (Virgin Media) - ↓ -Internet Routers (hidden hops) - ↓ -Google Backbone - ↓ -Google Server ✅ - -``` -**Why * * * happens** - -**Routers may ignore traceroute because:** - -- Firewall blocks ICMP replies -- Security hardening -- Rate limiting -- Cloud provider protection -👉 It does NOT mean failure - -**Key Takeaway** - -```traceroute``` shows the internet path, not just the destination — revealing how your request travels through routers, ISPs, and cloud backbone networks before reaching Google. - -# 4. Listening Ports - -**It shows what your machine is actually “listening” to.** - -**Command** - -``ss -tulpn`` - -🔍 What ```ss -tulpn``` means - -```ss = socket statistics``` - -**It shows:** -- Open ports -- Listening services -- TCP/UDP connections -- Which processes are using them - -```text - -ubuntu@Kartik:~/LinuxForDevOps/day14$ ss -tulpn -Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process -udp UNCONN 0 0 127.0.0.54:53 0.0.0.0:* -udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* -udp UNCONN 0 0 10.255.255.254:53 0.0.0.0:* -udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* -udp UNCONN 0 0 [::1]:323 [::]:* -tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* -tcp LISTEN 0 4096 127.0.0.54:53 0.0.0.0:* -tcp LISTEN 0 1000 10.255.255.254:53 0.0.0.0:* -tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* -tcp LISTEN 0 511 [::]:80 [::]:* - -``` - -**🧠 Your system overview** - -**You currently have:** -- DNS services running (port 53) -- Local system resolver active -- Web server listening on port 80 -- Loopback + private network bindings - -# 5. Name Resolution - -```dig google.com``` - -**This is a perfect real-world DNS resolution trace** - -🌐 What ```dig google.com``` did - -**dig = DNS lookup tool** - -It asked: **What are the IP addresses for google.com?** - -**Output** - -```text -ubuntu@Kartik:~/LinuxForDevOps/day14$ dig google.com - -; <<>> DiG 9.18.39-0ubuntu0.24.04.5-Ubuntu <<>> google.com -;; global options: +cmd -;; Got answer: -;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11112 -;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1 - -;; OPT PSEUDOSECTION: -; EDNS: version: 0, flags:; udp: 512 -;; QUESTION SECTION: -;google.com. IN A - -;; ANSWER SECTION: -google.com. 63 IN A 142.251.30.101 -google.com. 63 IN A 142.251.30.139 -google.com. 63 IN A 142.251.30.138 -google.com. 63 IN A 142.251.30.100 -google.com. 63 IN A 142.251.30.102 -google.com. 63 IN A 142.251.30.113 - -;; Query time: 31 msec -;; SERVER: 10.255.255.254#53(10.255.255.254) (UDP) -;; WHEN: Sun May 31 12:33:33 BST 2026 -;; MSG SIZE rcvd: 135 -``` -**🌐 Resolved IPs ^** - -``` -142.251.30.101 -142.251.30.139 -142.251.30.138 -142.251.30.100 -142.251.30.102 -142.251.30.113 -``` - -**🧠 Why multiple IPs?** - -Because Google uses: - -🔥 Load Balancing : Traffic distributed across servers - -🌍 Geo-routing : You connect to nearest data center - -⚡ High availability : If one server fails, others respond - -👉 This is why Google never goes down easily - -# 6. HTTP Check - -```curl -I https://google.com``` - -🌐 What this command does - -```curl -I = send HTTP HEAD request (headers only)``` - -**You are asking: Give me only metadata about google.com, HEADER DETAILS Only not the full page.** - -**Output** - -``` -ubuntu@Kartik:~/LinuxForDevOps/day14$ curl -I https://google.com -HTTP/2 301 -location: https://www.google.com/ -content-type: text/html; charset=UTF-8 -content-security-policy-report-only: object-src 'none';base-uri 'self';script-src 'nonce-KIi4ninNsWjFZ_OPAIpAIw' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp -date: Sun, 31 May 2026 11:51:42 GMT -expires: Tue, 30 Jun 2026 11:51:42 GMT -cache-control: public, max-age=2592000 -server: gws -content-length: 220 -x-xss-protection: 0 -x-frame-options: SAMEORIGIN -alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 -``` - -**🔐 1. Protocol Used** - -```HTTP/2 301``` - -🧠 Meaning: - -- HTTP/2 → modern, multiplexed web protocol -- 301 → Permanent Redirect - -# 7. Connections Snapshot - -**Command** - -```netstat -an | head``` - -``` -netstat = network statistics --a = all connections --n = numeric (no DNS resolution) -``` - -**netstat shows your machine is running DNS resolver services on port 53 and a web server listening on port 80 across IPv4 and IPv6 interfaces.** - -**Output** - -**This output is basically a snapshot of all active network sockets on your machine** - -``` -ubuntu@Kartik:~/LinuxForDevOps/day14$ netstat -an | head -Active Internet connections (servers and established) -Proto Recv-Q Send-Q Local Address Foreign Address State -tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -tcp 0 0 127.0.0.54:53 0.0.0.0:* LISTEN -tcp 0 0 10.255.255.254:53 0.0.0.0:* LISTEN -tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -tcp 0 0 127.0.0.1:50638 127.0.0.1:80 ESTABLISHED -tcp 0 0 127.0.0.1:50650 127.0.0.1:80 ESTABLISHED -tcp 0 0 127.0.0.1:80 127.0.0.1:50638 ESTABLISHED -tcp 0 0 127.0.0.1:80 127.0.0.1:50650 ESTABLISHED - -``` -1. ESTABLISHED connections: 4 -2. LISTEN connections: 4 - ---- - -# 8. Mini Task: Port Probe & Interpret - -**Task 1 : Identify one listening port from ss -tulpn (e.g., SSH on 22 or a local web app).** - -``` -ubuntu@Kartik:~/LinuxForDevOps/day14$ ss -tulpn -Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process -udp UNCONN 0 0 127.0.0.54:53 0.0.0.0:* -udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* -udp UNCONN 0 0 10.255.255.254:53 0.0.0.0:* -udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* -udp UNCONN 0 0 [::1]:323 [::]:* -tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* -tcp LISTEN 0 4096 127.0.0.54:53 0.0.0.0:* -tcp LISTEN 0 1000 10.255.255.254:53 0.0.0.0:* -tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* -tcp LISTEN 0 511 [::]:80 [::]:* -``` - -**Listening Service Identified** - -- Service: DNS Resolver (systemd-resolved) + Web Server - -- Ports: - -1. Port 53 → DNS infrastructure (critical for internet access) -2. Port 80 → Web traffic (HTTP server) - -**Task 2 : From the same machine, test it: ```nc -zv localhost``` (or curl -I http://localhost:).** - -**Command** - -```nc -zv localhost 80``` - -**Output** - -``` -ubuntu@Kartik:~/LinuxForDevOps/day14$ nc -zv localhost 80 -Connection to localhost (127.0.0.1) 80 port [tcp/http] succeeded! -``` - -**OR** - -**Command** - -```curl -I http://localhost:80``` - -**Output** - -```ubuntu@Kartik:~/LinuxForDevOps/day14$ curl -I http://localhost:80 -HTTP/1.1 200 OK -Server: nginx/1.24.0 (Ubuntu) -Date: Sun, 31 May 2026 12:17:18 GMT -Content-Type: text/html -Content-Length: 615 -Last-Modified: Thu, 21 May 2026 06:26:26 GMT -Connection: keep-alive -ETag: "6a0ea592-267" -Accept-Ranges: bytes -``` - -**Interpretation** - -Reachable: Yes / No -If not reachable, next checks: -Verify service status (systemctl status ) -Check firewall rules (ufw status, iptables -L) -Review application logs - - -# 🧠 Networking Reflection (DevOps Troubleshooting Guide) - ---- - -# ⚡ 1. Which command gives you the fastest signal when something is broken? - -## 📡 `ping` -- Quickly confirms basic network connectivity -- Detects packet loss and latency issues - -👉 Use when: -- You suspect network is down -- You want quick connectivity check - ---- - -## 🌐 `curl -I` -- Checks if a web service is responding -- Verifies HTTP/HTTPS status without downloading full content - -👉 Use when: -- Website is slow or not loading -- You want to check server availability - ---- - -# 🧩 2. What layer would you inspect if DNS fails? - -## 🌍 Primary Layer: -- **Application Layer (DNS Service)** - ---- - -## 🔍 Next checks: -- Transport Layer → UDP/TCP port 53 -- Internet Layer → IP connectivity - -👉 Meaning: -Start from DNS resolver, then move downward in OSI stack if needed. - ---- - -# 🚨 3. What layer would you inspect if HTTP 500 appears? - -## 🌐 Layer: -- **Application Layer** - ---- - -## 🔍 What to check: -- Web server logs (nginx / apache) -- Backend application logs -- Database connectivity issues -- API/service dependencies - -👉 Meaning: -HTTP 500 = server-side failure, not network issue - ---- - -# 🛠️ 4. Two follow-up checks during a real incident - ---- - -## 🔎 Check active listening services - -```bash id="cmd1" -ss -tulpn \ No newline at end of file +--- \ No newline at end of file From 23c810f9816ca5ce295b0d8bbc8c40b5c2ca2467 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 13:34:19 +0100 Subject: [PATCH 17/35] hands-on --- 2026/day-14/{day-14-networking.md => day-14-networking1.md} | 0 ...y-14-networking-hands-on.md => day-14-networking2-hands-on.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename 2026/day-14/{day-14-networking.md => day-14-networking1.md} (100%) rename 2026/day-14/{day-14-networking-hands-on.md => day-14-networking2-hands-on.md} (100%) diff --git a/2026/day-14/day-14-networking.md b/2026/day-14/day-14-networking1.md similarity index 100% rename from 2026/day-14/day-14-networking.md rename to 2026/day-14/day-14-networking1.md diff --git a/2026/day-14/day-14-networking-hands-on.md b/2026/day-14/day-14-networking2-hands-on.md similarity index 100% rename from 2026/day-14/day-14-networking-hands-on.md rename to 2026/day-14/day-14-networking2-hands-on.md From 63df3cc89116e84efe6c6fdebd342aa283d3d632 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 13:41:14 +0100 Subject: [PATCH 18/35] formatting --- 2026/day-14/day-14-networking1.md | 12 ------------ 2026/day-14/day-14-networking2-hands-on.md | 15 ++++++--------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/2026/day-14/day-14-networking1.md b/2026/day-14/day-14-networking1.md index 5399aa6c78..d0859b8170 100644 --- a/2026/day-14/day-14-networking1.md +++ b/2026/day-14/day-14-networking1.md @@ -6,8 +6,6 @@ A network is simply: > 🧠 A group of devices connected so they can talk to each other. ---- - ## 📌 Examples: - Your laptop ↔ router @@ -15,8 +13,6 @@ A network is simply: - Servers ↔ other servers - Your device ↔ Google ---- - ## 🔗 They can be connected using: - 🔌 Cables (Ethernet) @@ -43,14 +39,10 @@ A network is simply: This document explains what happens behind the scenes when you type `www.google.com` in your browser and press Enter, mapped to the **OSI Model (7 Layers)**. ---- - # 🧠 Scenario Overview When you open Google, your computer performs multiple networking steps in milliseconds to fetch and display the webpage. ---- - # 🌐 Step-by-Step OSI Model Breakdown --- @@ -202,10 +194,6 @@ The OSI model helps us understand: - How data travels across networks - How different devices communicate - How complex networking is broken into simple layers - ---- - - --- # 💡 Key Insight diff --git a/2026/day-14/day-14-networking2-hands-on.md b/2026/day-14/day-14-networking2-hands-on.md index 2e89543459..aff7f60d29 100644 --- a/2026/day-14/day-14-networking2-hands-on.md +++ b/2026/day-14/day-14-networking2-hands-on.md @@ -424,8 +424,6 @@ Review application logs - You suspect network is down - You want quick connectivity check ---- - ## 🌐 `curl -I` - Checks if a web service is responding - Verifies HTTP/HTTPS status without downloading full content @@ -441,8 +439,6 @@ Review application logs ## 🌍 Primary Layer: - **Application Layer (DNS Service)** ---- - ## 🔍 Next checks: - Transport Layer → UDP/TCP port 53 - Internet Layer → IP connectivity @@ -457,8 +453,6 @@ Start from DNS resolver, then move downward in OSI stack if needed. ## 🌐 Layer: - **Application Layer** ---- - ## 🔍 What to check: - Web server logs (nginx / apache) - Backend application logs @@ -472,9 +466,12 @@ HTTP 500 = server-side failure, not network issue # 🛠️ 4. Two follow-up checks during a real incident ---- - ## 🔎 Check active listening services ```bash id="cmd1" -ss -tulpn \ No newline at end of file +ss -tulpn +``` +## 🔎 Verify DNS and application response with: + +```dig ``` +```curl -I ``` \ No newline at end of file From 61ae2b97cc535ac7824cbdf250fb7755e86ee4d7 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 13:44:55 +0100 Subject: [PATCH 19/35] formatting --- 2026/day-14/day-14-networking2-hands-on.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/2026/day-14/day-14-networking2-hands-on.md b/2026/day-14/day-14-networking2-hands-on.md index aff7f60d29..c694364f54 100644 --- a/2026/day-14/day-14-networking2-hands-on.md +++ b/2026/day-14/day-14-networking2-hands-on.md @@ -412,8 +412,6 @@ Review application logs # 🧠 Networking Reflection (DevOps Troubleshooting Guide) ---- - # ⚡ 1. Which command gives you the fastest signal when something is broken? ## 📡 `ping` From f7473af0a0d3c1d6433f4d2cd0a7c15d6e70161d Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 21:19:54 +0100 Subject: [PATCH 20/35] networking dns, ips --- 2026/day-15/day-15-networking-concepts.md | 362 ++++++++++++++++++++++ 1 file changed, 362 insertions(+) create mode 100644 2026/day-15/day-15-networking-concepts.md diff --git a/2026/day-15/day-15-networking-concepts.md b/2026/day-15/day-15-networking-concepts.md new file mode 100644 index 0000000000..4ac476ae74 --- /dev/null +++ b/2026/day-15/day-15-networking-concepts.md @@ -0,0 +1,362 @@ +## Day 15 - Understand how DNS resolves names to IPs + +The Domain Name System (DNS) is the "phonebook of the Internet". +It translates human-readable domain names (e.g., google.com) into machine-readable IP addresses (e.g., 192.0.2.1). +Computers connect to each other using numbers, so DNS makes browsing the web user-friendly. + +## Task 1. How DNS Resolves Names to IPs + +When you type a web address into your browser, a highly structured sequence of events takes place to locate the correct server. + +**The Short DNS Flow** + +📥 Request: You type a URL `google.com` +🔍 Cache: Your device checks local memory first. +🔄 Resolver: If missing, your ISP server takes over. +🌐 Root: The resolver asks Root where the TLD is. +🏷️ TLD: The resolver asks .com (or similar) where the domain lives. +🔑 Authoritative: The domain's nameserver gives the final IP. +🖥️ Connect: The resolver hands the IP to your browser. +🌐 Load: The website opens. + +--- + +## DNS Record Types + +### A Record +Maps a domain name to an IPv4 address. + +### AAAA Record +Maps a domain name to an IPv6 address. + +### CNAME Record +Creates an alias from one domain name to another domain name. + +### MX Record +Specifies the mail servers responsible for receiving emails for a domain. + +### NS Record +Identifies the authoritative name servers for a domain. + +--- + +## `dig` Command + +### Command + +```bash +dig google.com +``` + +### Sample Output (Relevant Section) + +```text +;; ANSWER SECTION: +google.com. 300 IN A 142.250.187.14 +``` + +### Identify the A Record + +- A Record: `142.250.187.14` + +### Identify the TTL + +- TTL: `300` seconds + +### Understanding the Output + +```text +google.com. 300 IN A 142.250.187.14 +│ │ │ +│ │ └── IPv4 Address (A Record) +│ └────────────── TTL (seconds) +└───────────────────────────── Domain Name +``` + +--- + +## Note + +The exact IP address and TTL may vary depending on your location, DNS resolver, and the time the query is executed. Run the command below on your machine and record the actual values from the ANSWER SECTION: + +```bash +dig google.com +``` +--- + +## Task 2. IP addressing (IPv4, public vs private) + +An IP address (Internet Protocol address) is a unique label assigned to every device connected to a network. +It ensures that data packets find the correct destination, similar to a physical mailing address + +**IPv4 Structure ** + +- IPv4 uses a 32-bit format, which creates roughly 4.3 billion unique addresses. +- The Format: Written in "dotted-decimal" notation (e.g., 192.168.1.1). +- The Blocks: Divided into four 8-bit numbers called octets. +- The Range: Each octet ranges from 0 to 255 (e.g., 0.0.0.0 to 255.255.255.255). +- The Parts: Contains a Network ID (identifies the specific network) and a Host ID (identifies the specific device on that network). + +**Public vs. Private IP Addresses** + +| Feature | Private IP Address | Public IP Address | +|----------|-------------------|------------------| +| Scope | Internal (local network only) | External (global internet) | +| Visibility | Hidden from the internet | Visible to the entire world | +| Uniqueness | Unique only within your local network | Unique across the entire internet | +| Cost | Completely free to use | Usually assigned/leased by an ISP | +| Routing | Cannot be routed over the public internet | Fully routable across global routers | + +## Private IP Ranges + +These ranges are reserved for internal networks: + +- `10.0.0.0` → `10.255.255.255` +- `172.16.0.0` → `172.31.255.255` +- `192.168.0.0` → `192.168.255.255` + + +## Identify Your IP Addresses (From `ip addr show`) + +### Observed Output +From the `eth0` interface: + +``` +inet 172.27.145.12/20 +``` + +From the `lo` (loopback) interface: + +``` +inet 127.0.0.1/8 +inet 10.255.255.254/32 +``` + +--- + +## Analysis + +### Primary Private IP (eth0) +- **IP Address:** `172.27.145.12` +- This is your machine’s main network IP +- It is used for communication within your private network + +--- + +### Loopback Interface (lo) +- `127.0.0.1` → Standard loopback address (your own machine) +- `10.255.255.254` → Also a private IP assigned to loopback in your environment (virtual routing/internal setup) + +--- + +## Are these Private IPs? + +Yes — all of the following are private/internal: + +- `172.27.145.12` → Private IP (belongs to 172.16.0.0 – 172.31.255.255 range) +- `10.255.255.254` → Private IP (10.0.0.0 – 10.255.255.255 range) +- `127.0.0.1` → Loopback (special internal testing address) + +--- + +## Key Observation + +Your system is running in a **virtualized or cloud-like environment**, which is why: + +- Your main IP is in the **172.27.x.x range** +- This is common in: + - WSL (Windows Subsystem for Linux) + - Docker networks + - Cloud VMs (AWS/Azure internal networking) + +--- + +## Final Summary + +- Your active interface: `eth0` +- Your working private IP: `172.27.145.12` +- Loopback is used for internal self-communication +- All observed IPs are non-public (private/internal) + +--- + +# Task 3: CIDR & Subnetting + +--- + +## What does `/24` mean in `192.168.1.0/24`? + +`/24` means that the first **24 bits are fixed as the network portion**, and the remaining **8 bits are available for host addresses**. + +- IPv4 address = 32 bits total +- `/24` → 24 bits network + 8 bits host +- This defines a subnet with 256 total IP addresses + +--- + +## Usable Hosts in Different Subnets + +### /24 +- Total IPs: 256 +- Usable hosts: **254** + - (2 reserved: network address + broadcast address) + +--- + +### /16 +- Total IPs: 65,536 +- Usable hosts: **65,534** + +--- + +### /28 +- Total IPs: 16 +- Usable hosts: **14** + +--- + +## Why Do We Subnet? + +Subnetting is used to divide a large network into smaller, manageable networks. + +### Key reasons: + +- **Efficient IP usage** → avoid wasting IP addresses +- **Better security** → isolate network segments +- **Improved performance** → smaller broadcast domains +- **Easier management** → organize networks by teams/services +- **Scalability** → easier to grow infrastructure + +--- + +## Quick CIDR Table + +| CIDR | Subnet Mask | Total IPs | Usable Hosts | +|------|---------------------|------------|--------------| +| /24 | 255.255.255.0 | 256 | 254 | +| /16 | 255.255.0.0 | 65,536 | 65,534 | +| /28 | 255.255.255.240 | 16 | 14 | + +--- + +## Key Formula + +``` +Total IPs = 2^(32 - CIDR) +Usable Hosts = Total IPs - 2 +``` + +--- + +## Example Breakdown + +### /28 example: +- 32 - 28 = 4 host bits +- 2^4 = 16 total IPs +- 16 - 2 = 14 usable hosts + +--- + +# Task 4: Ports – The Doors to Services + +## What is a Port? + +A **port** is a logical communication endpoint used by operating systems to identify specific services running on a machine. + +### Why do we need ports? + +- A single machine can run multiple services +- IP address identifies the machine +- Port number identifies the specific service on that machine + +👉 Think of it like: +- IP Address = Building address +- Port = Apartment number inside the building + +## Common Ports and Services + +| Port | Service | +|------|----------------| +| 22 | SSH (Secure Shell) | +| 80 | HTTP (Web traffic) | +| 443 | HTTPS (Secure web traffic) | +| 53 | DNS (Domain Name System) | +| 3306 | MySQL Database | +| 6379 | Redis Cache | +| 27017 | MongoDB Database | + +## Checking Listening Ports + +### Command: +```bash +ss -tulpn +``` +## Understanding Output + +Example output snippet: +```text +LISTEN 0 128 0.0.0.0:22 +LISTEN 0 511 0.0.0.0:80 +``` +## Match Ports to Services (Example Interpretation) + +From a typical Linux system: + +- **Port 22** + - Service: SSH + - Used for remote server login + +- **Port 80** + - Service: HTTP + - Used for serving web pages + +--- + +## How to Identify Services in Your Output + +Look for lines like: + +```text +LISTEN 0 128 0.0.0.0:22 users:(("sshd",pid=1234)) +``` + +Interpretation: +- `22` → Port number +- `sshd` → Service name (SSH daemon) + +## Key Takeaway + +- Ports allow multiple services on one machine +- Without ports, only one service could run per IP +- DevOps engineers use `ss -tulpn` daily to debug services + +## Quick Mental Model + +- IP = machine +- Port = service inside machine +- Process = actual program using that port + +--- + +# Task 5: Putting It Together + +--- + +## 1. You run `curl http://myapp.com:8080` — what networking concepts are involved? + +This request involves **DNS resolution** to convert `myapp.com` into an IP address. Then a **TCP connection** is established to port `8080` on the server. Finally, the **HTTP protocol (Application layer)** is used to send the request and receive a response. + +--- + +## 2. Your app can't reach a database at `10.0.1.50:3306` — what would you check first? + +First, I would check **network connectivity** using `ping 10.0.1.50` and verify if the host is reachable. Then I would check if the **MySQL service is running and listening on port 3306** using `ss -tulpn`. Finally, I would inspect **firewall rules and security groups** that might be blocking access to that port. + +--- + +## Key Thinking Approach + +When troubleshooting: +- Start with **network reachability (IP layer)** +- Then check **port/service availability (Transport layer)** +- Finally verify **application/service health (Application layer)** \ No newline at end of file From 54513f0cac1012d829242bedc770a6cb2afb8980 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 21:25:21 +0100 Subject: [PATCH 21/35] networking dns, ips --- 2026/day-15/day-15-networking-concepts.md | 38 ++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/2026/day-15/day-15-networking-concepts.md b/2026/day-15/day-15-networking-concepts.md index 4ac476ae74..3880aeea9e 100644 --- a/2026/day-15/day-15-networking-concepts.md +++ b/2026/day-15/day-15-networking-concepts.md @@ -359,4 +359,40 @@ First, I would check **network connectivity** using `ping 10.0.1.50` and verify When troubleshooting: - Start with **network reachability (IP layer)** - Then check **port/service availability (Transport layer)** -- Finally verify **application/service health (Application layer)** \ No newline at end of file +- Finally verify **application/service health (Application layer)** + +--- + +# IPv4 vs IPv6 + +## IPv4 +- 32-bit addressing system +- Written in decimal format (e.g. `192.168.1.10`) +- Supports ~4.3 billion addresses +- Most widely used in current networks + +## IPv6 +- 128-bit addressing system +- Written in hexadecimal format (e.g. `2001:db8::1`) +- Supports a massive number of addresses +- Designed to replace IPv4 +- Mostly used in IOT, CDNs, AWS, Google + +## Why IPv6 Was Introduced + +# IPv4 addresses are running out due to: + +- Growth of the internet +- Mobile devices +- Cloud infrastructure +- IoT devices + +**IPv6 solves this by providing a massive address space.** + +# Examples + +- inet 172.27.145.12 -- (IPv4) +- inet6 fe80::215:5dff -- (IPv6) + +## Key Difference +IPv4 has limited addresses and uses NAT to cope, while IPv6 was introduced to solve address exhaustion with a much larger address space. \ No newline at end of file From 5db5bcd4ad34234bf4dc62c3bba1ce651dcbda85 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 21:30:52 +0100 Subject: [PATCH 22/35] networking dns, ips --- 2026/day-15/day-15-networking-concepts.md | 48 ++++++----------------- 1 file changed, 11 insertions(+), 37 deletions(-) diff --git a/2026/day-15/day-15-networking-concepts.md b/2026/day-15/day-15-networking-concepts.md index 3880aeea9e..957172cdac 100644 --- a/2026/day-15/day-15-networking-concepts.md +++ b/2026/day-15/day-15-networking-concepts.md @@ -10,14 +10,14 @@ When you type a web address into your browser, a highly structured sequence of e **The Short DNS Flow** -📥 Request: You type a URL `google.com` -🔍 Cache: Your device checks local memory first. -🔄 Resolver: If missing, your ISP server takes over. -🌐 Root: The resolver asks Root where the TLD is. -🏷️ TLD: The resolver asks .com (or similar) where the domain lives. -🔑 Authoritative: The domain's nameserver gives the final IP. -🖥️ Connect: The resolver hands the IP to your browser. -🌐 Load: The website opens. +- 📥 Request: You type a URL `google.com` +- 🔍 Cache: Your device checks local memory first. +- 🔄 Resolver: If missing, your ISP server takes over. +- 🌐 Root: The resolver asks Root where the TLD is. +- 🏷️ TLD: The resolver asks .com (or similar) where the domain lives. +- 🔑 Authoritative: The domain's nameserver gives the final IP. +- 🖥️ Connect: The resolver hands the IP to your browser. +- 🌐 Load: The website opens. --- @@ -89,7 +89,7 @@ dig google.com An IP address (Internet Protocol address) is a unique label assigned to every device connected to a network. It ensures that data packets find the correct destination, similar to a physical mailing address -**IPv4 Structure ** +**IPv4 Structure** - IPv4 uses a 32-bit format, which creates roughly 4.3 billion unique addresses. - The Format: Written in "dotted-decimal" notation (e.g., 192.168.1.1). @@ -131,9 +131,6 @@ From the `lo` (loopback) interface: inet 127.0.0.1/8 inet 10.255.255.254/32 ``` - ---- - ## Analysis ### Primary Private IP (eth0) @@ -141,14 +138,10 @@ inet 10.255.255.254/32 - This is your machine’s main network IP - It is used for communication within your private network ---- - ### Loopback Interface (lo) - `127.0.0.1` → Standard loopback address (your own machine) - `10.255.255.254` → Also a private IP assigned to loopback in your environment (virtual routing/internal setup) ---- - ## Are these Private IPs? Yes — all of the following are private/internal: @@ -157,8 +150,6 @@ Yes — all of the following are private/internal: - `10.255.255.254` → Private IP (10.0.0.0 – 10.255.255.255 range) - `127.0.0.1` → Loopback (special internal testing address) ---- - ## Key Observation Your system is running in a **virtualized or cloud-like environment**, which is why: @@ -169,8 +160,6 @@ Your system is running in a **virtualized or cloud-like environment**, which is - Docker networks - Cloud VMs (AWS/Azure internal networking) ---- - ## Final Summary - Your active interface: `eth0` @@ -181,18 +170,14 @@ Your system is running in a **virtualized or cloud-like environment**, which is --- # Task 3: CIDR & Subnetting - ---- - + ## What does `/24` mean in `192.168.1.0/24`? `/24` means that the first **24 bits are fixed as the network portion**, and the remaining **8 bits are available for host addresses**. - IPv4 address = 32 bits total - `/24` → 24 bits network + 8 bits host -- This defines a subnet with 256 total IP addresses - ---- +- This defines a subnet with **256** total IP addresses ## Usable Hosts in Different Subnets @@ -201,20 +186,14 @@ Your system is running in a **virtualized or cloud-like environment**, which is - Usable hosts: **254** - (2 reserved: network address + broadcast address) ---- - ### /16 - Total IPs: 65,536 - Usable hosts: **65,534** ---- - ### /28 - Total IPs: 16 - Usable hosts: **14** ---- - ## Why Do We Subnet? Subnetting is used to divide a large network into smaller, manageable networks. @@ -237,17 +216,12 @@ Subnetting is used to divide a large network into smaller, manageable networks. | /16 | 255.255.0.0 | 65,536 | 65,534 | | /28 | 255.255.255.240 | 16 | 14 | ---- - ## Key Formula ``` Total IPs = 2^(32 - CIDR) Usable Hosts = Total IPs - 2 ``` - ---- - ## Example Breakdown ### /28 example: From 9bb3144c866726938a8c68c84959aa97091f7627 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 21:31:36 +0100 Subject: [PATCH 23/35] networking dns, ips --- 2026/day-15/day-15-networking-concepts.md | 1 + 1 file changed, 1 insertion(+) diff --git a/2026/day-15/day-15-networking-concepts.md b/2026/day-15/day-15-networking-concepts.md index 957172cdac..fb3c7aebaf 100644 --- a/2026/day-15/day-15-networking-concepts.md +++ b/2026/day-15/day-15-networking-concepts.md @@ -2,6 +2,7 @@ The Domain Name System (DNS) is the "phonebook of the Internet". It translates human-readable domain names (e.g., google.com) into machine-readable IP addresses (e.g., 192.0.2.1). + Computers connect to each other using numbers, so DNS makes browsing the web user-friendly. ## Task 1. How DNS Resolves Names to IPs From 5f3579d2651368d90e258114ee64e155d2d50c7f Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 21:33:00 +0100 Subject: [PATCH 24/35] networking dns, ips --- 2026/day-15/day-15-networking-concepts.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/2026/day-15/day-15-networking-concepts.md b/2026/day-15/day-15-networking-concepts.md index fb3c7aebaf..a3012e823f 100644 --- a/2026/day-15/day-15-networking-concepts.md +++ b/2026/day-15/day-15-networking-concepts.md @@ -1,7 +1,7 @@ ## Day 15 - Understand how DNS resolves names to IPs -The Domain Name System (DNS) is the "phonebook of the Internet". -It translates human-readable domain names (e.g., google.com) into machine-readable IP addresses (e.g., 192.0.2.1). +The Domain Name System (**DNS**) is the "phonebook of the Internet". +It translates human-readable domain names (e.g., `google.com`) into machine-readable IP addresses `(e.g., 192.0.2.1)`. Computers connect to each other using numbers, so DNS makes browsing the web user-friendly. @@ -78,7 +78,9 @@ google.com. 300 IN A 142.250.187.14 ## Note -The exact IP address and TTL may vary depending on your location, DNS resolver, and the time the query is executed. Run the command below on your machine and record the actual values from the ANSWER SECTION: +The exact IP address and TTL may vary depending on your location, DNS resolver, and the time the query is executed. + +Run the command below on your machine and record the actual values from the ANSWER SECTION: ```bash dig google.com @@ -88,6 +90,7 @@ dig google.com ## Task 2. IP addressing (IPv4, public vs private) An IP address (Internet Protocol address) is a unique label assigned to every device connected to a network. + It ensures that data packets find the correct destination, similar to a physical mailing address **IPv4 Structure** From b2eb171fe2f4cbba7245851d0ad85140ce856cbf Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 21:34:12 +0100 Subject: [PATCH 25/35] networking dns, ips --- 2026/day-15/day-15-networking-concepts.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/2026/day-15/day-15-networking-concepts.md b/2026/day-15/day-15-networking-concepts.md index a3012e823f..cc040a6cad 100644 --- a/2026/day-15/day-15-networking-concepts.md +++ b/2026/day-15/day-15-networking-concepts.md @@ -20,8 +20,6 @@ When you type a web address into your browser, a highly structured sequence of e - 🖥️ Connect: The resolver hands the IP to your browser. - 🌐 Load: The website opens. ---- - ## DNS Record Types ### A Record @@ -39,8 +37,6 @@ Specifies the mail servers responsible for receiving emails for a domain. ### NS Record Identifies the authoritative name servers for a domain. ---- - ## `dig` Command ### Command From 9ebfdd1d00d524104480e24384e07620bd1ba884 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 21:35:43 +0100 Subject: [PATCH 26/35] networking dns, ips --- 2026/day-15/day-15-networking-concepts.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2026/day-15/day-15-networking-concepts.md b/2026/day-15/day-15-networking-concepts.md index cc040a6cad..071782df76 100644 --- a/2026/day-15/day-15-networking-concepts.md +++ b/2026/day-15/day-15-networking-concepts.md @@ -92,9 +92,9 @@ It ensures that data packets find the correct destination, similar to a physical **IPv4 Structure** - IPv4 uses a 32-bit format, which creates roughly 4.3 billion unique addresses. -- The Format: Written in "dotted-decimal" notation (e.g., 192.168.1.1). +- The Format: Written in "dotted-decimal" notation `(e.g., 192.168.1.1)`. - The Blocks: Divided into four 8-bit numbers called octets. -- The Range: Each octet ranges from 0 to 255 (e.g., 0.0.0.0 to 255.255.255.255). +- The Range: Each octet ranges from 0 to 255 `(e.g., 0.0.0.0 to 255.255.255.255)`. - The Parts: Contains a Network ID (identifies the specific network) and a Host ID (identifies the specific device on that network). **Public vs. Private IP Addresses** From 1ac805f7cfc80d0880441d682db263057cb73147 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 21:39:07 +0100 Subject: [PATCH 27/35] networking dns, ips --- 2026/day-15/day-15-networking-concepts.md | 56 ++++++++++++++++++----- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/2026/day-15/day-15-networking-concepts.md b/2026/day-15/day-15-networking-concepts.md index 071782df76..fb7bbd947b 100644 --- a/2026/day-15/day-15-networking-concepts.md +++ b/2026/day-15/day-15-networking-concepts.md @@ -178,21 +178,55 @@ Your system is running in a **virtualized or cloud-like environment**, which is - IPv4 address = 32 bits total - `/24` → 24 bits network + 8 bits host - This defines a subnet with **256** total IP addresses +# Usable Hosts in Different Subnets (with IP Ranges) -## Usable Hosts in Different Subnets +--- + +## /24 Subnet + +- Example Network: `192.168.1.0/24` +- Subnet Mask: `255.255.255.0` + +### IP Range +- Network Address: `192.168.1.0` +- Usable Hosts: `192.168.1.1 – 192.168.1.254` +- Broadcast Address: `192.168.1.255` + +### Summary +- Total IPs: 256 +- Usable Hosts: 254 + +--- + +## /16 Subnet + +- Example Network: `10.0.0.0/16` +- Subnet Mask: `255.255.0.0` + +### IP Range +- Network Address: `10.0.0.0` +- Usable Hosts: `10.0.0.1 – 10.0.255.254` +- Broadcast Address: `10.0.255.255` + +### Summary +- Total IPs: 65,536 +- Usable Hosts: 65,534 + +--- + +## /28 Subnet -### /24 -- Total IPs: 256 -- Usable hosts: **254** - - (2 reserved: network address + broadcast address) +- Example Network: `192.168.1.0/28` +- Subnet Mask: `255.255.255.240` -### /16 -- Total IPs: 65,536 -- Usable hosts: **65,534** +### IP Range +- Network Address: `192.168.1.0` +- Usable Hosts: `192.168.1.1 – 192.168.1.14` +- Broadcast Address: `192.168.1.15` -### /28 -- Total IPs: 16 -- Usable hosts: **14** +### Summary +- Total IPs: 16 +- Usable Hosts: 14 ## Why Do We Subnet? From 282a918eb7fbce3d1416373bd48656001cc8358c Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sun, 31 May 2026 21:42:57 +0100 Subject: [PATCH 28/35] networking dns, ips --- 2026/day-15/day-15-networking-concepts.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2026/day-15/day-15-networking-concepts.md b/2026/day-15/day-15-networking-concepts.md index fb7bbd947b..a1586c0282 100644 --- a/2026/day-15/day-15-networking-concepts.md +++ b/2026/day-15/day-15-networking-concepts.md @@ -399,8 +399,8 @@ When troubleshooting: # Examples -- inet 172.27.145.12 -- (IPv4) -- inet6 fe80::215:5dff -- (IPv6) +- inet `172.27.145.12` -- **(IPv4)** +- inet6 `fe80::215:5dff` -- **(IPv6)** ## Key Difference IPv4 has limited addresses and uses NAT to cope, while IPv6 was introduced to solve address exhaustion with a much larger address space. \ No newline at end of file From da03ee1005f5a801de3e8935e25e06ff40105ae3 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sat, 6 Jun 2026 20:07:12 +0100 Subject: [PATCH 29/35] md formatting instructions --- .../instructions/md-formatting.instructions.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/instructions/md-formatting.instructions.md diff --git a/.github/instructions/md-formatting.instructions.md b/.github/instructions/md-formatting.instructions.md new file mode 100644 index 0000000000..9c3b677862 --- /dev/null +++ b/.github/instructions/md-formatting.instructions.md @@ -0,0 +1,18 @@ +--- +name: md-formatting +description: "Apply consistent Markdown formatting to all .md files in this repository, with commands formatted as code and emojis used for emphasis and clarity." +applyTo: "**/*.md" +--- + +Use this instruction for every Markdown file in the repository. + +- Format commands and CLI examples using inline backticks for commands (`git status`) and fenced code blocks for longer snippets. +- Use headings, lists, and bold text to structure content clearly. +- Add emojis for emphasis and readability, for example: + - ✅ for success or recommended actions + - ⚠️ for warnings and caveats + - 💡 for tips and notes + - 🔧 for technical steps +- Keep prose clear and concise, with proper sentence spacing. +- Avoid raw unformatted command text in paragraphs; commands should always be in Markdown code formatting. +- Ensure generated or updated Markdown follows the repo's consistent style across `README.md`, lesson notes, and other `.md` files. From 66c1667fc7ecfba05cd7d65b78c0acee4eb2c3dc Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Sat, 6 Jun 2026 20:18:18 +0100 Subject: [PATCH 30/35] day-23 --- 2026/day-23/day-23-notes.md | 194 ++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 2026/day-23/day-23-notes.md diff --git a/2026/day-23/day-23-notes.md b/2026/day-23/day-23-notes.md new file mode 100644 index 0000000000..0303e9af0b --- /dev/null +++ b/2026/day-23/day-23-notes.md @@ -0,0 +1,194 @@ +# Day 23 Notes — Git Branching & Working with GitHub + +## ✅ Task Summary +- Create `day-23-notes.md` answering the challenge questions and documenting commands. +- Practice creating branches, switching, committing, pushing to GitHub, and syncing forks. + +--- + +## 🔀 1) What is a branch in Git? +A branch is a movable pointer to a commit. It represents an independent line of development so you can work on features, fixes, or experiments without changing the `main` branch. + +- Example: list branches + +```bash +git branch +``` + +--- + +## 💡 2) Why use branches instead of committing everything to `main`? +- Isolate work: keep unfinished or experimental work separate. +- Collaboration: multiple people can work on different features simultaneously. +- Safer history: `main` stays stable and deployable. + +--- + +## 🧭 3) What is `HEAD` in Git? +`HEAD` is a pointer to the current commit (usually the tip of the current branch). When you switch branches, `HEAD` moves to point at the tip of that branch. + +- Show `HEAD` status: + +```bash +git status +``` + +--- + +## 🔁 4) What happens to your files when you switch branches? +- Git updates your working directory to match the commit that `HEAD` points to on the target branch. Uncommitted changes may be preserved, or Git may ask you to stash/commit them before switching if they would conflict. + +--- + +## 🔧 Task 2 — Branching Commands (Hands-On) +Commands and examples to perform the requested steps: + +- List branches + +```bash +git branch +``` + +- Create a new branch `feature-1` + +```bash +git branch feature-1 +``` + +- Switch to `feature-1` (modern command) + +```bash +git switch feature-1 +``` + +- Create and switch in one command (`feature-2`) + +```bash +git switch -c feature-2 +# or legacy: git checkout -b feature-2 +``` + +- Difference: `git switch` vs `git checkout` + - `git switch` is focused on switching branches (safer, clearer). + - `git checkout` can switch branches *and* restore files; it's more powerful but more confusing. + +- Make a commit on `feature-1` that does not exist on `main`: + +```bash +# on feature-1 +git add . +git commit -m "Add feature-1 changes" +``` + +- Switch back to `main` and verify the commit is not there + +```bash +git switch main +git log --oneline --decorate --graph -n 5 +``` + +- Delete a branch you no longer need + +```bash +git branch -d feature-1 # safe delete (only if merged) +# or force delete: +git branch -D feature-1 +``` + +- Push branch to remote and set upstream + +```bash +git push -u origin feature-1 +``` + +Add these commands to your `git-commands.md` as practice. + +--- + +## 🌐 Task 3 — Push to GitHub +Steps to push to a new GitHub repo (do not initialize remote with README): + +```bash +# create repo on GitHub via website +git remote add origin git@github.com:YOURUSERNAME/devops-git-practice.git +git push -u origin main +git push -u origin feature-1 +``` + +- `origin` vs `upstream`: + - `origin` is the default name for the remote you cloned from (your remote fork or repo). + - `upstream` commonly refers to the original repository you forked from. Use `upstream` when you want to fetch changes from the original project. + +--- + +## 🔄 Task 4 — Pull from GitHub +- Make a change on GitHub using the editor, then pull locally: + +```bash +git pull +# or fetch then merge manually: +git fetch origin +git merge origin/main +``` + +- `git fetch` vs `git pull`: + - `git fetch` downloads commits and refs from remote into your local repo but does not change your working tree. + - `git pull` is `git fetch` followed by `git merge` (or `git rebase` if configured) into your current branch. + +--- + +## 🍴 Task 5 — Clone vs Fork +- `git clone` copies a remote repository to your local machine. + +```bash +git clone https://github.com/OWNER/REPO.git +``` + +- `Fork` (GitHub): creates your own copy of a repository on GitHub. Then clone your fork to work on it. + +When to use which: +- Clone: when you already have write access or are working within the same repo. +- Fork: when you want to contribute to someone else's project without direct write access. + +Keeping your fork in sync with the original repo (common approach): + +```bash +# add upstream once +git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git +# fetch upstream changes +git fetch upstream +# update your main +git switch main +git merge upstream/main +# or rebase +git rebase upstream/main +# push updated main to your fork +git push origin main +``` + +--- + +## ✅ Notes & Recommended Commands to Add to `git-commands.md` +- `git branch`, `git branch ` +- `git switch `, `git switch -c ` +- `git checkout -b ` (legacy) +- `git add .`, `git commit -m "msg"` +- `git push -u origin ` +- `git remote add origin ` +- `git remote add upstream ` +- `git fetch upstream`, `git merge upstream/main` + +--- + +## 📌 Submission Checklist +- [ ] Add `day-23-notes.md` to `2026/day-23/` (this file) +- [ ] Update `git-commands.md` in your `devops-git-practice` repo +- [ ] Push branches and repo to GitHub + +--- + +If you'd like, I can also: +- Add these commands into your `git-commands.md` for you ✅ +- Run a quick checklist script to verify remote branches (requires shell access) 🔍 + +Happy learning! 🚀 From 9dc0dfaa0e99fca1aa37fe9e3d489e994064e53a Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Wed, 10 Jun 2026 21:06:29 +0100 Subject: [PATCH 31/35] commit 1 --- 2026/day-23/day-23-notes.md | 194 ++++++++++++++++ 2026/day-25/day-25-notes.md | 447 ++++++++++++++++++++++++++++++++++++ 2 files changed, 641 insertions(+) create mode 100644 2026/day-23/day-23-notes.md create mode 100644 2026/day-25/day-25-notes.md diff --git a/2026/day-23/day-23-notes.md b/2026/day-23/day-23-notes.md new file mode 100644 index 0000000000..0303e9af0b --- /dev/null +++ b/2026/day-23/day-23-notes.md @@ -0,0 +1,194 @@ +# Day 23 Notes — Git Branching & Working with GitHub + +## ✅ Task Summary +- Create `day-23-notes.md` answering the challenge questions and documenting commands. +- Practice creating branches, switching, committing, pushing to GitHub, and syncing forks. + +--- + +## 🔀 1) What is a branch in Git? +A branch is a movable pointer to a commit. It represents an independent line of development so you can work on features, fixes, or experiments without changing the `main` branch. + +- Example: list branches + +```bash +git branch +``` + +--- + +## 💡 2) Why use branches instead of committing everything to `main`? +- Isolate work: keep unfinished or experimental work separate. +- Collaboration: multiple people can work on different features simultaneously. +- Safer history: `main` stays stable and deployable. + +--- + +## 🧭 3) What is `HEAD` in Git? +`HEAD` is a pointer to the current commit (usually the tip of the current branch). When you switch branches, `HEAD` moves to point at the tip of that branch. + +- Show `HEAD` status: + +```bash +git status +``` + +--- + +## 🔁 4) What happens to your files when you switch branches? +- Git updates your working directory to match the commit that `HEAD` points to on the target branch. Uncommitted changes may be preserved, or Git may ask you to stash/commit them before switching if they would conflict. + +--- + +## 🔧 Task 2 — Branching Commands (Hands-On) +Commands and examples to perform the requested steps: + +- List branches + +```bash +git branch +``` + +- Create a new branch `feature-1` + +```bash +git branch feature-1 +``` + +- Switch to `feature-1` (modern command) + +```bash +git switch feature-1 +``` + +- Create and switch in one command (`feature-2`) + +```bash +git switch -c feature-2 +# or legacy: git checkout -b feature-2 +``` + +- Difference: `git switch` vs `git checkout` + - `git switch` is focused on switching branches (safer, clearer). + - `git checkout` can switch branches *and* restore files; it's more powerful but more confusing. + +- Make a commit on `feature-1` that does not exist on `main`: + +```bash +# on feature-1 +git add . +git commit -m "Add feature-1 changes" +``` + +- Switch back to `main` and verify the commit is not there + +```bash +git switch main +git log --oneline --decorate --graph -n 5 +``` + +- Delete a branch you no longer need + +```bash +git branch -d feature-1 # safe delete (only if merged) +# or force delete: +git branch -D feature-1 +``` + +- Push branch to remote and set upstream + +```bash +git push -u origin feature-1 +``` + +Add these commands to your `git-commands.md` as practice. + +--- + +## 🌐 Task 3 — Push to GitHub +Steps to push to a new GitHub repo (do not initialize remote with README): + +```bash +# create repo on GitHub via website +git remote add origin git@github.com:YOURUSERNAME/devops-git-practice.git +git push -u origin main +git push -u origin feature-1 +``` + +- `origin` vs `upstream`: + - `origin` is the default name for the remote you cloned from (your remote fork or repo). + - `upstream` commonly refers to the original repository you forked from. Use `upstream` when you want to fetch changes from the original project. + +--- + +## 🔄 Task 4 — Pull from GitHub +- Make a change on GitHub using the editor, then pull locally: + +```bash +git pull +# or fetch then merge manually: +git fetch origin +git merge origin/main +``` + +- `git fetch` vs `git pull`: + - `git fetch` downloads commits and refs from remote into your local repo but does not change your working tree. + - `git pull` is `git fetch` followed by `git merge` (or `git rebase` if configured) into your current branch. + +--- + +## 🍴 Task 5 — Clone vs Fork +- `git clone` copies a remote repository to your local machine. + +```bash +git clone https://github.com/OWNER/REPO.git +``` + +- `Fork` (GitHub): creates your own copy of a repository on GitHub. Then clone your fork to work on it. + +When to use which: +- Clone: when you already have write access or are working within the same repo. +- Fork: when you want to contribute to someone else's project without direct write access. + +Keeping your fork in sync with the original repo (common approach): + +```bash +# add upstream once +git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git +# fetch upstream changes +git fetch upstream +# update your main +git switch main +git merge upstream/main +# or rebase +git rebase upstream/main +# push updated main to your fork +git push origin main +``` + +--- + +## ✅ Notes & Recommended Commands to Add to `git-commands.md` +- `git branch`, `git branch ` +- `git switch `, `git switch -c ` +- `git checkout -b ` (legacy) +- `git add .`, `git commit -m "msg"` +- `git push -u origin ` +- `git remote add origin ` +- `git remote add upstream ` +- `git fetch upstream`, `git merge upstream/main` + +--- + +## 📌 Submission Checklist +- [ ] Add `day-23-notes.md` to `2026/day-23/` (this file) +- [ ] Update `git-commands.md` in your `devops-git-practice` repo +- [ ] Push branches and repo to GitHub + +--- + +If you'd like, I can also: +- Add these commands into your `git-commands.md` for you ✅ +- Run a quick checklist script to verify remote branches (requires shell access) 🔍 + +Happy learning! 🚀 diff --git a/2026/day-25/day-25-notes.md b/2026/day-25/day-25-notes.md new file mode 100644 index 0000000000..780d02cdce --- /dev/null +++ b/2026/day-25/day-25-notes.md @@ -0,0 +1,447 @@ +# Day 25 Notes — Git Reset vs Revert & Branching Strategies + +## ✅ Overview +Master **undoing mistakes safely** and understand **branching strategies** used by engineering teams at scale. + +--- + +## 🔙 Task 1: Git Reset — Understanding the Three Modes + +### What is `git reset`? +`git reset` moves the `HEAD` pointer to a previous commit, optionally discarding or preserving changes. + +--- + +### Mode 1: `git reset --soft` + +**What happens:** +- `HEAD` moves to the target commit +- Staging area is updated to match that commit +- **Working directory is NOT changed** — your modified files remain + +**Use case:** You want to undo commits but keep changes staged, ready to recommit differently. + +```bash +git reset --soft HEAD~1 +``` + +**Example:** +```bash +# After reset --soft +# Your changes are still there, staged and ready to recommit +git status +# On branch main +# Changes to be committed: +# modified: file.txt +``` + +--- + +### Mode 2: `git reset --mixed` (Default) + +**What happens:** +- `HEAD` moves to the target commit +- Staging area is updated to match that commit +- **Working directory is NOT changed** — modified files remain, but are **unstaged** + +**Use case:** You want to undo commits and unstage changes so you can selectively re-add them. + +```bash +git reset --mixed HEAD~1 +# or simply: +git reset HEAD~1 +``` + +**Example:** +```bash +# After reset --mixed +# Your changes are still there, but unstaged +git status +# On branch main +# Changes not staged for commit: +# modified: file.txt +``` + +--- + +### Mode 3: `git reset --hard` ⚠️ DESTRUCTIVE + +**What happens:** +- `HEAD` moves to the target commit +- Staging area is updated to match that commit +- **Working directory IS changed** — all uncommitted changes are **discarded** + +**Use case:** You want to completely undo commits and lose all local changes (dangerous!). + +```bash +git reset --hard HEAD~1 +``` + +**Example:** +```bash +# After reset --hard +# Your uncommitted changes are gone forever! +git status +# On branch main +# nothing to commit, working tree clean +``` + +--- + +### 🎯 Key Differences: Soft vs Mixed vs Hard + +| Mode | HEAD | Staging Area | Working Directory | Safe? | +|------|------|--------------|-------------------|-------| +| `--soft` | Moves | Updated | Unchanged | ✅ Yes | +| `--mixed` | Moves | Updated | Unchanged | ✅ Yes | +| `--hard` | Moves | Updated | **Discarded** | ⚠️ No | + +--- + +### ⚠️ Which is Destructive and Why? + +**`git reset --hard` is destructive** because it permanently deletes uncommitted changes in your working directory. You cannot recover them unless they were previously committed. + +--- + +### 📋 When to Use Each + +- **`--soft`:** Redo your last commit with different changes (keep everything staged) +- **`--mixed`:** Undo commits and pick-and-choose what to re-stage +- **`--hard`:** Completely discard all changes and go back to a clean state (use with caution!) + +--- + +### ⚡ Should You Use `git reset` on Pushed Commits? + +**Short answer: NO, never on shared branches.** + +**Why:** +- `git reset` rewrites history +- Others who pulled those commits will have conflicts +- Their local history won't match the remote + +**Safe alternative:** Use `git revert` for shared branches (see Task 2). + +**When reset is OK:** +- On local-only branches (not yet pushed) +- On your personal fork before pushing + +--- + +## 🔄 Task 2: Git Revert — The Safe Way to Undo + +### What is `git revert`? + +`git revert` creates a **new commit** that undoes the changes from a previous commit. It **does NOT rewrite history**. + +```bash +git revert +``` + +--- + +### How it Works + +1. You specify a commit to revert +2. Git creates a **new commit** that reverses those changes +3. The original commit **stays in history** +4. The new commit is added to the top + +**Example:** + +```bash +# Current history: +# commit C (HEAD) +# commit B +# commit A + +git revert B +# Result: +# commit C' (new, with B's changes reversed) +# commit C +# commit B +# commit A +``` + +--- + +### ✅ Is Commit Y Still in History? + +**Yes!** When you revert commit Y, commit Y remains in the history. A **new commit** is created that reverses Y's changes. + +```bash +git log --oneline +# c9f3e2c Revert commit Y +# 4b2a1d1 commit Z +# 7e5f8c0 commit Y +# 9a3d2f1 commit X +``` + +--- + +### 🤝 Why Revert is Safer for Shared Branches + +- `git revert` **preserves history** — no rewrites, no surprises +- Everyone who pulled the original commit can still see it +- Safe to use on branches others depend on +- Can be easily reverted again if needed + +--- + +### 🔀 When to Use Revert vs Reset + +- **Use `reset`:** On local-only branches, before pushing +- **Use `revert`:** On shared/pushed branches, in production code + +--- + +## 📊 Task 3: Reset vs Revert Comparison + +| | `git reset` | `git revert` | +|---|---|---| +| **What it does** | Moves `HEAD` to previous commit | Creates new commit that undoes changes | +| **Removes commit from history?** | Yes — history is rewritten | No — original commit stays | +| **Safe for shared/pushed branches?** | ❌ No (rewrites history) | ✅ Yes (preserves history) | +| **When to use** | Local branches before push | Shared/production branches | +| **Undoing the undo** | Difficult (`git reflog` helps) | Easy (`git revert `) | +| **Performance** | Fast | Slightly slower (creates commit) | + +--- + +## 🌳 Task 4: Branching Strategies + +### Strategy 1: GitFlow + +**Overview:** +GitFlow uses multiple long-lived branches for different purposes. It's structured and suitable for scheduled releases. + +**Branches:** +- `main` — production-ready code (stable) +- `develop` — integration branch (pre-release) +- `feature/*` — new features (from `develop`) +- `release/*` — release preparation (from `develop`) +- `hotfix/*` — urgent production fixes (from `main`) + +**Flow Diagram:** +``` + main (v1.0) + ↑ ↑ + | | + hotfix release/1.0 + | ↓ + -----+----+-----develop + | / | \ + feature/A / | \ feature/B + / | \ +``` + +**When used:** +- Large teams with formal release cycles +- Enterprise applications +- Examples: Git, Android OS, large open-source projects + +**Pros:** +- ✅ Clear separation of concerns +- ✅ Easy to manage multiple versions in parallel +- ✅ Hotfixes isolated from ongoing development + +**Cons:** +- ❌ Complex (many branch types) +- ❌ Slower release cycle +- ❌ Overhead for small teams + +--- + +### Strategy 2: GitHub Flow + +**Overview:** +GitHub Flow is simple and continuous. One main branch, short-lived feature branches, and pull requests. + +**Branches:** +- `main` — always deployable +- `feature/` — short-lived feature branches (from `main`) +- Pull Request → Code Review → Merge → Deploy + +**Flow Diagram:** +``` + main (always ready to deploy) + ↑ ↑ ↑ + | | | + PR3 PR2 PR1 + | | | + feature-C feature-B feature-A +``` + +**When used:** +- Startups and fast-moving teams +- Continuous deployment environments +- Examples: GitHub itself, many modern SaaS products + +**Pros:** +- ✅ Simple to understand and implement +- ✅ Fast feedback loop +- ✅ Continuous deployment friendly + +**Cons:** +- ❌ Requires discipline (main must always be deployable) +- ❌ No long-term support for older versions +- ❌ Hard to manage multiple active releases + +--- + +### Strategy 3: Trunk-Based Development + +**Overview:** +Everyone commits directly to the main trunk (`main` or `trunk`). Feature branches are extremely short-lived (hours, not days). + +**Branches:** +- `main` — single source of truth +- `feature/` — short-lived (1-2 days max) +- Feature flags control new code visibility + +**Flow Diagram:** +``` +main ●─●─●─●─●─●─●─●─●─●─●─● + ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ + (rapid commits) +``` + +**When used:** +- High-velocity teams (Google, Netflix, Facebook) +- CI/CD-heavy workflows +- Large-scale distributed development + +**Pros:** +- ✅ Minimal merge conflicts +- ✅ Forces small, reviewable commits +- ✅ Continuous integration friendly + +**Cons:** +- ❌ Requires excellent test coverage +- ❌ High discipline required +- ❌ Hard for inexperienced teams + +--- + +### 🎯 Answering the Strategy Questions + +**Q: Which strategy for a startup shipping fast?** +- **Answer:** GitHub Flow — simple, fast, continuous deployment. + +**Q: Which strategy for a large team with scheduled releases?** +- **Answer:** GitFlow — structured, supports multiple versions. + +**Q: Which does your favorite open-source use?** +- **Examples:** + - React, Vue: GitHub Flow (rapid releases) + - Linux Kernel: Trunk-based with release branches + - Many enterprises: GitFlow (stable, versioned) + +Check by looking at the repo's branch structure on GitHub. + +--- + +## 🛠️ Task 5: Git Commands Reference Update + +### Complete Git Command Reference (Days 22–25) + +#### Setup & Config +```bash +git config --global user.name "Your Name" +git config --global user.email "your@email.com" +git config --list +``` + +#### Basic Workflow +```bash +git init # Initialize a new repo +git add # Stage a file +git add . # Stage all changes +git status # View staged/unstaged changes +git commit -m "message" # Create a commit +git log --oneline # Show commit history +git log --graph --decorate --oneline # Visual history +git diff # Show unstaged changes +git diff --staged # Show staged changes +``` + +#### Branching +```bash +git branch # List local branches +git branch -a # List all branches (local + remote) +git branch # Create a branch +git switch # Switch to a branch (modern) +git checkout # Switch to a branch (legacy) +git switch -c # Create and switch in one command +git branch -d # Delete a branch (safe) +git branch -D # Force delete a branch +``` + +#### Remote & Sync +```bash +git remote add origin # Add remote +git remote -v # View remotes +git push -u origin # Push branch and set upstream +git push # Push current branch +git pull # Fetch and merge +git fetch # Download changes (no merge) +git clone # Clone a repository +git clone --depth 1 # Shallow clone +``` + +#### Merging & Rebasing +```bash +git merge # Merge branch into current +git rebase # Rebase current onto branch +git cherry-pick # Apply specific commit +``` + +#### Stash +```bash +git stash # Save work temporarily +git stash list # View stashed changes +git stash pop # Apply and remove stash +git stash apply # Apply stash without removing +git stash drop # Delete a stash +``` + +#### Reset & Revert +```bash +git reset --soft HEAD~1 # Undo commit, keep staged +git reset --mixed HEAD~1 # Undo commit, unstage changes +git reset --hard HEAD~1 # Undo commit, discard changes +git revert # Create commit that undoes changes +git reflog # View all Git operations (safety net) +``` + +#### Viewing History +```bash +git log # View commit history +git log --oneline -n 5 # Last 5 commits +git log --author="name" # Filter by author +git log -p # Show detailed changes +git show # Show specific commit +``` + +--- + +## 🎓 Summary & Key Takeaways + +✅ **Git Reset:** Use for local branches to rewrite history (destructive) +✅ **Git Revert:** Use for shared branches to safely undo changes +✅ **GitFlow:** Best for scheduled releases, large teams +✅ **GitHub Flow:** Best for startups, continuous deployment +✅ **Trunk-Based:** Best for high-velocity, experienced teams +✅ **`git reflog`:** Your safety net after dangerous operations + +--- + +## 📝 Submission Checklist + +- [ ] Create `day-25-notes.md` (this file) +- [ ] Update `git-commands.md` with all commands from Days 22–25 +- [ ] Commit and push to your fork +- [ ] Share learning on LinkedIn + +Happy learning! 🚀 From 3e9239b4bac2b307e82995f38fc71570b97ac279 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Wed, 10 Jun 2026 21:08:27 +0100 Subject: [PATCH 32/35] This reverts commit 9dc0dfaa0e99fca1aa37fe9e3d489e994064e53a. hi revert this commit --- 2026/day-23/day-23-notes.md | 194 ---------------- 2026/day-25/day-25-notes.md | 447 ------------------------------------ 2 files changed, 641 deletions(-) delete mode 100644 2026/day-23/day-23-notes.md delete mode 100644 2026/day-25/day-25-notes.md diff --git a/2026/day-23/day-23-notes.md b/2026/day-23/day-23-notes.md deleted file mode 100644 index 0303e9af0b..0000000000 --- a/2026/day-23/day-23-notes.md +++ /dev/null @@ -1,194 +0,0 @@ -# Day 23 Notes — Git Branching & Working with GitHub - -## ✅ Task Summary -- Create `day-23-notes.md` answering the challenge questions and documenting commands. -- Practice creating branches, switching, committing, pushing to GitHub, and syncing forks. - ---- - -## 🔀 1) What is a branch in Git? -A branch is a movable pointer to a commit. It represents an independent line of development so you can work on features, fixes, or experiments without changing the `main` branch. - -- Example: list branches - -```bash -git branch -``` - ---- - -## 💡 2) Why use branches instead of committing everything to `main`? -- Isolate work: keep unfinished or experimental work separate. -- Collaboration: multiple people can work on different features simultaneously. -- Safer history: `main` stays stable and deployable. - ---- - -## 🧭 3) What is `HEAD` in Git? -`HEAD` is a pointer to the current commit (usually the tip of the current branch). When you switch branches, `HEAD` moves to point at the tip of that branch. - -- Show `HEAD` status: - -```bash -git status -``` - ---- - -## 🔁 4) What happens to your files when you switch branches? -- Git updates your working directory to match the commit that `HEAD` points to on the target branch. Uncommitted changes may be preserved, or Git may ask you to stash/commit them before switching if they would conflict. - ---- - -## 🔧 Task 2 — Branching Commands (Hands-On) -Commands and examples to perform the requested steps: - -- List branches - -```bash -git branch -``` - -- Create a new branch `feature-1` - -```bash -git branch feature-1 -``` - -- Switch to `feature-1` (modern command) - -```bash -git switch feature-1 -``` - -- Create and switch in one command (`feature-2`) - -```bash -git switch -c feature-2 -# or legacy: git checkout -b feature-2 -``` - -- Difference: `git switch` vs `git checkout` - - `git switch` is focused on switching branches (safer, clearer). - - `git checkout` can switch branches *and* restore files; it's more powerful but more confusing. - -- Make a commit on `feature-1` that does not exist on `main`: - -```bash -# on feature-1 -git add . -git commit -m "Add feature-1 changes" -``` - -- Switch back to `main` and verify the commit is not there - -```bash -git switch main -git log --oneline --decorate --graph -n 5 -``` - -- Delete a branch you no longer need - -```bash -git branch -d feature-1 # safe delete (only if merged) -# or force delete: -git branch -D feature-1 -``` - -- Push branch to remote and set upstream - -```bash -git push -u origin feature-1 -``` - -Add these commands to your `git-commands.md` as practice. - ---- - -## 🌐 Task 3 — Push to GitHub -Steps to push to a new GitHub repo (do not initialize remote with README): - -```bash -# create repo on GitHub via website -git remote add origin git@github.com:YOURUSERNAME/devops-git-practice.git -git push -u origin main -git push -u origin feature-1 -``` - -- `origin` vs `upstream`: - - `origin` is the default name for the remote you cloned from (your remote fork or repo). - - `upstream` commonly refers to the original repository you forked from. Use `upstream` when you want to fetch changes from the original project. - ---- - -## 🔄 Task 4 — Pull from GitHub -- Make a change on GitHub using the editor, then pull locally: - -```bash -git pull -# or fetch then merge manually: -git fetch origin -git merge origin/main -``` - -- `git fetch` vs `git pull`: - - `git fetch` downloads commits and refs from remote into your local repo but does not change your working tree. - - `git pull` is `git fetch` followed by `git merge` (or `git rebase` if configured) into your current branch. - ---- - -## 🍴 Task 5 — Clone vs Fork -- `git clone` copies a remote repository to your local machine. - -```bash -git clone https://github.com/OWNER/REPO.git -``` - -- `Fork` (GitHub): creates your own copy of a repository on GitHub. Then clone your fork to work on it. - -When to use which: -- Clone: when you already have write access or are working within the same repo. -- Fork: when you want to contribute to someone else's project without direct write access. - -Keeping your fork in sync with the original repo (common approach): - -```bash -# add upstream once -git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git -# fetch upstream changes -git fetch upstream -# update your main -git switch main -git merge upstream/main -# or rebase -git rebase upstream/main -# push updated main to your fork -git push origin main -``` - ---- - -## ✅ Notes & Recommended Commands to Add to `git-commands.md` -- `git branch`, `git branch ` -- `git switch `, `git switch -c ` -- `git checkout -b ` (legacy) -- `git add .`, `git commit -m "msg"` -- `git push -u origin ` -- `git remote add origin ` -- `git remote add upstream ` -- `git fetch upstream`, `git merge upstream/main` - ---- - -## 📌 Submission Checklist -- [ ] Add `day-23-notes.md` to `2026/day-23/` (this file) -- [ ] Update `git-commands.md` in your `devops-git-practice` repo -- [ ] Push branches and repo to GitHub - ---- - -If you'd like, I can also: -- Add these commands into your `git-commands.md` for you ✅ -- Run a quick checklist script to verify remote branches (requires shell access) 🔍 - -Happy learning! 🚀 diff --git a/2026/day-25/day-25-notes.md b/2026/day-25/day-25-notes.md deleted file mode 100644 index 780d02cdce..0000000000 --- a/2026/day-25/day-25-notes.md +++ /dev/null @@ -1,447 +0,0 @@ -# Day 25 Notes — Git Reset vs Revert & Branching Strategies - -## ✅ Overview -Master **undoing mistakes safely** and understand **branching strategies** used by engineering teams at scale. - ---- - -## 🔙 Task 1: Git Reset — Understanding the Three Modes - -### What is `git reset`? -`git reset` moves the `HEAD` pointer to a previous commit, optionally discarding or preserving changes. - ---- - -### Mode 1: `git reset --soft` - -**What happens:** -- `HEAD` moves to the target commit -- Staging area is updated to match that commit -- **Working directory is NOT changed** — your modified files remain - -**Use case:** You want to undo commits but keep changes staged, ready to recommit differently. - -```bash -git reset --soft HEAD~1 -``` - -**Example:** -```bash -# After reset --soft -# Your changes are still there, staged and ready to recommit -git status -# On branch main -# Changes to be committed: -# modified: file.txt -``` - ---- - -### Mode 2: `git reset --mixed` (Default) - -**What happens:** -- `HEAD` moves to the target commit -- Staging area is updated to match that commit -- **Working directory is NOT changed** — modified files remain, but are **unstaged** - -**Use case:** You want to undo commits and unstage changes so you can selectively re-add them. - -```bash -git reset --mixed HEAD~1 -# or simply: -git reset HEAD~1 -``` - -**Example:** -```bash -# After reset --mixed -# Your changes are still there, but unstaged -git status -# On branch main -# Changes not staged for commit: -# modified: file.txt -``` - ---- - -### Mode 3: `git reset --hard` ⚠️ DESTRUCTIVE - -**What happens:** -- `HEAD` moves to the target commit -- Staging area is updated to match that commit -- **Working directory IS changed** — all uncommitted changes are **discarded** - -**Use case:** You want to completely undo commits and lose all local changes (dangerous!). - -```bash -git reset --hard HEAD~1 -``` - -**Example:** -```bash -# After reset --hard -# Your uncommitted changes are gone forever! -git status -# On branch main -# nothing to commit, working tree clean -``` - ---- - -### 🎯 Key Differences: Soft vs Mixed vs Hard - -| Mode | HEAD | Staging Area | Working Directory | Safe? | -|------|------|--------------|-------------------|-------| -| `--soft` | Moves | Updated | Unchanged | ✅ Yes | -| `--mixed` | Moves | Updated | Unchanged | ✅ Yes | -| `--hard` | Moves | Updated | **Discarded** | ⚠️ No | - ---- - -### ⚠️ Which is Destructive and Why? - -**`git reset --hard` is destructive** because it permanently deletes uncommitted changes in your working directory. You cannot recover them unless they were previously committed. - ---- - -### 📋 When to Use Each - -- **`--soft`:** Redo your last commit with different changes (keep everything staged) -- **`--mixed`:** Undo commits and pick-and-choose what to re-stage -- **`--hard`:** Completely discard all changes and go back to a clean state (use with caution!) - ---- - -### ⚡ Should You Use `git reset` on Pushed Commits? - -**Short answer: NO, never on shared branches.** - -**Why:** -- `git reset` rewrites history -- Others who pulled those commits will have conflicts -- Their local history won't match the remote - -**Safe alternative:** Use `git revert` for shared branches (see Task 2). - -**When reset is OK:** -- On local-only branches (not yet pushed) -- On your personal fork before pushing - ---- - -## 🔄 Task 2: Git Revert — The Safe Way to Undo - -### What is `git revert`? - -`git revert` creates a **new commit** that undoes the changes from a previous commit. It **does NOT rewrite history**. - -```bash -git revert -``` - ---- - -### How it Works - -1. You specify a commit to revert -2. Git creates a **new commit** that reverses those changes -3. The original commit **stays in history** -4. The new commit is added to the top - -**Example:** - -```bash -# Current history: -# commit C (HEAD) -# commit B -# commit A - -git revert B -# Result: -# commit C' (new, with B's changes reversed) -# commit C -# commit B -# commit A -``` - ---- - -### ✅ Is Commit Y Still in History? - -**Yes!** When you revert commit Y, commit Y remains in the history. A **new commit** is created that reverses Y's changes. - -```bash -git log --oneline -# c9f3e2c Revert commit Y -# 4b2a1d1 commit Z -# 7e5f8c0 commit Y -# 9a3d2f1 commit X -``` - ---- - -### 🤝 Why Revert is Safer for Shared Branches - -- `git revert` **preserves history** — no rewrites, no surprises -- Everyone who pulled the original commit can still see it -- Safe to use on branches others depend on -- Can be easily reverted again if needed - ---- - -### 🔀 When to Use Revert vs Reset - -- **Use `reset`:** On local-only branches, before pushing -- **Use `revert`:** On shared/pushed branches, in production code - ---- - -## 📊 Task 3: Reset vs Revert Comparison - -| | `git reset` | `git revert` | -|---|---|---| -| **What it does** | Moves `HEAD` to previous commit | Creates new commit that undoes changes | -| **Removes commit from history?** | Yes — history is rewritten | No — original commit stays | -| **Safe for shared/pushed branches?** | ❌ No (rewrites history) | ✅ Yes (preserves history) | -| **When to use** | Local branches before push | Shared/production branches | -| **Undoing the undo** | Difficult (`git reflog` helps) | Easy (`git revert `) | -| **Performance** | Fast | Slightly slower (creates commit) | - ---- - -## 🌳 Task 4: Branching Strategies - -### Strategy 1: GitFlow - -**Overview:** -GitFlow uses multiple long-lived branches for different purposes. It's structured and suitable for scheduled releases. - -**Branches:** -- `main` — production-ready code (stable) -- `develop` — integration branch (pre-release) -- `feature/*` — new features (from `develop`) -- `release/*` — release preparation (from `develop`) -- `hotfix/*` — urgent production fixes (from `main`) - -**Flow Diagram:** -``` - main (v1.0) - ↑ ↑ - | | - hotfix release/1.0 - | ↓ - -----+----+-----develop - | / | \ - feature/A / | \ feature/B - / | \ -``` - -**When used:** -- Large teams with formal release cycles -- Enterprise applications -- Examples: Git, Android OS, large open-source projects - -**Pros:** -- ✅ Clear separation of concerns -- ✅ Easy to manage multiple versions in parallel -- ✅ Hotfixes isolated from ongoing development - -**Cons:** -- ❌ Complex (many branch types) -- ❌ Slower release cycle -- ❌ Overhead for small teams - ---- - -### Strategy 2: GitHub Flow - -**Overview:** -GitHub Flow is simple and continuous. One main branch, short-lived feature branches, and pull requests. - -**Branches:** -- `main` — always deployable -- `feature/` — short-lived feature branches (from `main`) -- Pull Request → Code Review → Merge → Deploy - -**Flow Diagram:** -``` - main (always ready to deploy) - ↑ ↑ ↑ - | | | - PR3 PR2 PR1 - | | | - feature-C feature-B feature-A -``` - -**When used:** -- Startups and fast-moving teams -- Continuous deployment environments -- Examples: GitHub itself, many modern SaaS products - -**Pros:** -- ✅ Simple to understand and implement -- ✅ Fast feedback loop -- ✅ Continuous deployment friendly - -**Cons:** -- ❌ Requires discipline (main must always be deployable) -- ❌ No long-term support for older versions -- ❌ Hard to manage multiple active releases - ---- - -### Strategy 3: Trunk-Based Development - -**Overview:** -Everyone commits directly to the main trunk (`main` or `trunk`). Feature branches are extremely short-lived (hours, not days). - -**Branches:** -- `main` — single source of truth -- `feature/` — short-lived (1-2 days max) -- Feature flags control new code visibility - -**Flow Diagram:** -``` -main ●─●─●─●─●─●─●─●─●─●─●─● - ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ - (rapid commits) -``` - -**When used:** -- High-velocity teams (Google, Netflix, Facebook) -- CI/CD-heavy workflows -- Large-scale distributed development - -**Pros:** -- ✅ Minimal merge conflicts -- ✅ Forces small, reviewable commits -- ✅ Continuous integration friendly - -**Cons:** -- ❌ Requires excellent test coverage -- ❌ High discipline required -- ❌ Hard for inexperienced teams - ---- - -### 🎯 Answering the Strategy Questions - -**Q: Which strategy for a startup shipping fast?** -- **Answer:** GitHub Flow — simple, fast, continuous deployment. - -**Q: Which strategy for a large team with scheduled releases?** -- **Answer:** GitFlow — structured, supports multiple versions. - -**Q: Which does your favorite open-source use?** -- **Examples:** - - React, Vue: GitHub Flow (rapid releases) - - Linux Kernel: Trunk-based with release branches - - Many enterprises: GitFlow (stable, versioned) - -Check by looking at the repo's branch structure on GitHub. - ---- - -## 🛠️ Task 5: Git Commands Reference Update - -### Complete Git Command Reference (Days 22–25) - -#### Setup & Config -```bash -git config --global user.name "Your Name" -git config --global user.email "your@email.com" -git config --list -``` - -#### Basic Workflow -```bash -git init # Initialize a new repo -git add # Stage a file -git add . # Stage all changes -git status # View staged/unstaged changes -git commit -m "message" # Create a commit -git log --oneline # Show commit history -git log --graph --decorate --oneline # Visual history -git diff # Show unstaged changes -git diff --staged # Show staged changes -``` - -#### Branching -```bash -git branch # List local branches -git branch -a # List all branches (local + remote) -git branch # Create a branch -git switch # Switch to a branch (modern) -git checkout # Switch to a branch (legacy) -git switch -c # Create and switch in one command -git branch -d # Delete a branch (safe) -git branch -D # Force delete a branch -``` - -#### Remote & Sync -```bash -git remote add origin # Add remote -git remote -v # View remotes -git push -u origin # Push branch and set upstream -git push # Push current branch -git pull # Fetch and merge -git fetch # Download changes (no merge) -git clone # Clone a repository -git clone --depth 1 # Shallow clone -``` - -#### Merging & Rebasing -```bash -git merge # Merge branch into current -git rebase # Rebase current onto branch -git cherry-pick # Apply specific commit -``` - -#### Stash -```bash -git stash # Save work temporarily -git stash list # View stashed changes -git stash pop # Apply and remove stash -git stash apply # Apply stash without removing -git stash drop # Delete a stash -``` - -#### Reset & Revert -```bash -git reset --soft HEAD~1 # Undo commit, keep staged -git reset --mixed HEAD~1 # Undo commit, unstage changes -git reset --hard HEAD~1 # Undo commit, discard changes -git revert # Create commit that undoes changes -git reflog # View all Git operations (safety net) -``` - -#### Viewing History -```bash -git log # View commit history -git log --oneline -n 5 # Last 5 commits -git log --author="name" # Filter by author -git log -p # Show detailed changes -git show # Show specific commit -``` - ---- - -## 🎓 Summary & Key Takeaways - -✅ **Git Reset:** Use for local branches to rewrite history (destructive) -✅ **Git Revert:** Use for shared branches to safely undo changes -✅ **GitFlow:** Best for scheduled releases, large teams -✅ **GitHub Flow:** Best for startups, continuous deployment -✅ **Trunk-Based:** Best for high-velocity, experienced teams -✅ **`git reflog`:** Your safety net after dangerous operations - ---- - -## 📝 Submission Checklist - -- [ ] Create `day-25-notes.md` (this file) -- [ ] Update `git-commands.md` with all commands from Days 22–25 -- [ ] Commit and push to your fork -- [ ] Share learning on LinkedIn - -Happy learning! 🚀 From b98e12df01de27c76c44e1b8e1d321809949def6 Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Wed, 10 Jun 2026 21:17:50 +0100 Subject: [PATCH 33/35] day-25-notes --- 2026/day-25/day-25-notes.md | 447 ++++++++++++++++++++++++++++++++++++ 1 file changed, 447 insertions(+) create mode 100644 2026/day-25/day-25-notes.md diff --git a/2026/day-25/day-25-notes.md b/2026/day-25/day-25-notes.md new file mode 100644 index 0000000000..780d02cdce --- /dev/null +++ b/2026/day-25/day-25-notes.md @@ -0,0 +1,447 @@ +# Day 25 Notes — Git Reset vs Revert & Branching Strategies + +## ✅ Overview +Master **undoing mistakes safely** and understand **branching strategies** used by engineering teams at scale. + +--- + +## 🔙 Task 1: Git Reset — Understanding the Three Modes + +### What is `git reset`? +`git reset` moves the `HEAD` pointer to a previous commit, optionally discarding or preserving changes. + +--- + +### Mode 1: `git reset --soft` + +**What happens:** +- `HEAD` moves to the target commit +- Staging area is updated to match that commit +- **Working directory is NOT changed** — your modified files remain + +**Use case:** You want to undo commits but keep changes staged, ready to recommit differently. + +```bash +git reset --soft HEAD~1 +``` + +**Example:** +```bash +# After reset --soft +# Your changes are still there, staged and ready to recommit +git status +# On branch main +# Changes to be committed: +# modified: file.txt +``` + +--- + +### Mode 2: `git reset --mixed` (Default) + +**What happens:** +- `HEAD` moves to the target commit +- Staging area is updated to match that commit +- **Working directory is NOT changed** — modified files remain, but are **unstaged** + +**Use case:** You want to undo commits and unstage changes so you can selectively re-add them. + +```bash +git reset --mixed HEAD~1 +# or simply: +git reset HEAD~1 +``` + +**Example:** +```bash +# After reset --mixed +# Your changes are still there, but unstaged +git status +# On branch main +# Changes not staged for commit: +# modified: file.txt +``` + +--- + +### Mode 3: `git reset --hard` ⚠️ DESTRUCTIVE + +**What happens:** +- `HEAD` moves to the target commit +- Staging area is updated to match that commit +- **Working directory IS changed** — all uncommitted changes are **discarded** + +**Use case:** You want to completely undo commits and lose all local changes (dangerous!). + +```bash +git reset --hard HEAD~1 +``` + +**Example:** +```bash +# After reset --hard +# Your uncommitted changes are gone forever! +git status +# On branch main +# nothing to commit, working tree clean +``` + +--- + +### 🎯 Key Differences: Soft vs Mixed vs Hard + +| Mode | HEAD | Staging Area | Working Directory | Safe? | +|------|------|--------------|-------------------|-------| +| `--soft` | Moves | Updated | Unchanged | ✅ Yes | +| `--mixed` | Moves | Updated | Unchanged | ✅ Yes | +| `--hard` | Moves | Updated | **Discarded** | ⚠️ No | + +--- + +### ⚠️ Which is Destructive and Why? + +**`git reset --hard` is destructive** because it permanently deletes uncommitted changes in your working directory. You cannot recover them unless they were previously committed. + +--- + +### 📋 When to Use Each + +- **`--soft`:** Redo your last commit with different changes (keep everything staged) +- **`--mixed`:** Undo commits and pick-and-choose what to re-stage +- **`--hard`:** Completely discard all changes and go back to a clean state (use with caution!) + +--- + +### ⚡ Should You Use `git reset` on Pushed Commits? + +**Short answer: NO, never on shared branches.** + +**Why:** +- `git reset` rewrites history +- Others who pulled those commits will have conflicts +- Their local history won't match the remote + +**Safe alternative:** Use `git revert` for shared branches (see Task 2). + +**When reset is OK:** +- On local-only branches (not yet pushed) +- On your personal fork before pushing + +--- + +## 🔄 Task 2: Git Revert — The Safe Way to Undo + +### What is `git revert`? + +`git revert` creates a **new commit** that undoes the changes from a previous commit. It **does NOT rewrite history**. + +```bash +git revert +``` + +--- + +### How it Works + +1. You specify a commit to revert +2. Git creates a **new commit** that reverses those changes +3. The original commit **stays in history** +4. The new commit is added to the top + +**Example:** + +```bash +# Current history: +# commit C (HEAD) +# commit B +# commit A + +git revert B +# Result: +# commit C' (new, with B's changes reversed) +# commit C +# commit B +# commit A +``` + +--- + +### ✅ Is Commit Y Still in History? + +**Yes!** When you revert commit Y, commit Y remains in the history. A **new commit** is created that reverses Y's changes. + +```bash +git log --oneline +# c9f3e2c Revert commit Y +# 4b2a1d1 commit Z +# 7e5f8c0 commit Y +# 9a3d2f1 commit X +``` + +--- + +### 🤝 Why Revert is Safer for Shared Branches + +- `git revert` **preserves history** — no rewrites, no surprises +- Everyone who pulled the original commit can still see it +- Safe to use on branches others depend on +- Can be easily reverted again if needed + +--- + +### 🔀 When to Use Revert vs Reset + +- **Use `reset`:** On local-only branches, before pushing +- **Use `revert`:** On shared/pushed branches, in production code + +--- + +## 📊 Task 3: Reset vs Revert Comparison + +| | `git reset` | `git revert` | +|---|---|---| +| **What it does** | Moves `HEAD` to previous commit | Creates new commit that undoes changes | +| **Removes commit from history?** | Yes — history is rewritten | No — original commit stays | +| **Safe for shared/pushed branches?** | ❌ No (rewrites history) | ✅ Yes (preserves history) | +| **When to use** | Local branches before push | Shared/production branches | +| **Undoing the undo** | Difficult (`git reflog` helps) | Easy (`git revert `) | +| **Performance** | Fast | Slightly slower (creates commit) | + +--- + +## 🌳 Task 4: Branching Strategies + +### Strategy 1: GitFlow + +**Overview:** +GitFlow uses multiple long-lived branches for different purposes. It's structured and suitable for scheduled releases. + +**Branches:** +- `main` — production-ready code (stable) +- `develop` — integration branch (pre-release) +- `feature/*` — new features (from `develop`) +- `release/*` — release preparation (from `develop`) +- `hotfix/*` — urgent production fixes (from `main`) + +**Flow Diagram:** +``` + main (v1.0) + ↑ ↑ + | | + hotfix release/1.0 + | ↓ + -----+----+-----develop + | / | \ + feature/A / | \ feature/B + / | \ +``` + +**When used:** +- Large teams with formal release cycles +- Enterprise applications +- Examples: Git, Android OS, large open-source projects + +**Pros:** +- ✅ Clear separation of concerns +- ✅ Easy to manage multiple versions in parallel +- ✅ Hotfixes isolated from ongoing development + +**Cons:** +- ❌ Complex (many branch types) +- ❌ Slower release cycle +- ❌ Overhead for small teams + +--- + +### Strategy 2: GitHub Flow + +**Overview:** +GitHub Flow is simple and continuous. One main branch, short-lived feature branches, and pull requests. + +**Branches:** +- `main` — always deployable +- `feature/` — short-lived feature branches (from `main`) +- Pull Request → Code Review → Merge → Deploy + +**Flow Diagram:** +``` + main (always ready to deploy) + ↑ ↑ ↑ + | | | + PR3 PR2 PR1 + | | | + feature-C feature-B feature-A +``` + +**When used:** +- Startups and fast-moving teams +- Continuous deployment environments +- Examples: GitHub itself, many modern SaaS products + +**Pros:** +- ✅ Simple to understand and implement +- ✅ Fast feedback loop +- ✅ Continuous deployment friendly + +**Cons:** +- ❌ Requires discipline (main must always be deployable) +- ❌ No long-term support for older versions +- ❌ Hard to manage multiple active releases + +--- + +### Strategy 3: Trunk-Based Development + +**Overview:** +Everyone commits directly to the main trunk (`main` or `trunk`). Feature branches are extremely short-lived (hours, not days). + +**Branches:** +- `main` — single source of truth +- `feature/` — short-lived (1-2 days max) +- Feature flags control new code visibility + +**Flow Diagram:** +``` +main ●─●─●─●─●─●─●─●─●─●─●─● + ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ + (rapid commits) +``` + +**When used:** +- High-velocity teams (Google, Netflix, Facebook) +- CI/CD-heavy workflows +- Large-scale distributed development + +**Pros:** +- ✅ Minimal merge conflicts +- ✅ Forces small, reviewable commits +- ✅ Continuous integration friendly + +**Cons:** +- ❌ Requires excellent test coverage +- ❌ High discipline required +- ❌ Hard for inexperienced teams + +--- + +### 🎯 Answering the Strategy Questions + +**Q: Which strategy for a startup shipping fast?** +- **Answer:** GitHub Flow — simple, fast, continuous deployment. + +**Q: Which strategy for a large team with scheduled releases?** +- **Answer:** GitFlow — structured, supports multiple versions. + +**Q: Which does your favorite open-source use?** +- **Examples:** + - React, Vue: GitHub Flow (rapid releases) + - Linux Kernel: Trunk-based with release branches + - Many enterprises: GitFlow (stable, versioned) + +Check by looking at the repo's branch structure on GitHub. + +--- + +## 🛠️ Task 5: Git Commands Reference Update + +### Complete Git Command Reference (Days 22–25) + +#### Setup & Config +```bash +git config --global user.name "Your Name" +git config --global user.email "your@email.com" +git config --list +``` + +#### Basic Workflow +```bash +git init # Initialize a new repo +git add # Stage a file +git add . # Stage all changes +git status # View staged/unstaged changes +git commit -m "message" # Create a commit +git log --oneline # Show commit history +git log --graph --decorate --oneline # Visual history +git diff # Show unstaged changes +git diff --staged # Show staged changes +``` + +#### Branching +```bash +git branch # List local branches +git branch -a # List all branches (local + remote) +git branch # Create a branch +git switch # Switch to a branch (modern) +git checkout # Switch to a branch (legacy) +git switch -c # Create and switch in one command +git branch -d # Delete a branch (safe) +git branch -D # Force delete a branch +``` + +#### Remote & Sync +```bash +git remote add origin # Add remote +git remote -v # View remotes +git push -u origin # Push branch and set upstream +git push # Push current branch +git pull # Fetch and merge +git fetch # Download changes (no merge) +git clone # Clone a repository +git clone --depth 1 # Shallow clone +``` + +#### Merging & Rebasing +```bash +git merge # Merge branch into current +git rebase # Rebase current onto branch +git cherry-pick # Apply specific commit +``` + +#### Stash +```bash +git stash # Save work temporarily +git stash list # View stashed changes +git stash pop # Apply and remove stash +git stash apply # Apply stash without removing +git stash drop # Delete a stash +``` + +#### Reset & Revert +```bash +git reset --soft HEAD~1 # Undo commit, keep staged +git reset --mixed HEAD~1 # Undo commit, unstage changes +git reset --hard HEAD~1 # Undo commit, discard changes +git revert # Create commit that undoes changes +git reflog # View all Git operations (safety net) +``` + +#### Viewing History +```bash +git log # View commit history +git log --oneline -n 5 # Last 5 commits +git log --author="name" # Filter by author +git log -p # Show detailed changes +git show # Show specific commit +``` + +--- + +## 🎓 Summary & Key Takeaways + +✅ **Git Reset:** Use for local branches to rewrite history (destructive) +✅ **Git Revert:** Use for shared branches to safely undo changes +✅ **GitFlow:** Best for scheduled releases, large teams +✅ **GitHub Flow:** Best for startups, continuous deployment +✅ **Trunk-Based:** Best for high-velocity, experienced teams +✅ **`git reflog`:** Your safety net after dangerous operations + +--- + +## 📝 Submission Checklist + +- [ ] Create `day-25-notes.md` (this file) +- [ ] Update `git-commands.md` with all commands from Days 22–25 +- [ ] Commit and push to your fork +- [ ] Share learning on LinkedIn + +Happy learning! 🚀 From d8f03b2fa56a73e040d86db63b7625be8ee7f32c Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Wed, 10 Jun 2026 21:25:34 +0100 Subject: [PATCH 34/35] commit 2 --- 2026/day-25/day-25-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2026/day-25/day-25-notes.md b/2026/day-25/day-25-notes.md index 780d02cdce..5239468c5d 100644 --- a/2026/day-25/day-25-notes.md +++ b/2026/day-25/day-25-notes.md @@ -1,4 +1,4 @@ -# Day 25 Notes — Git Reset vs Revert & Branching Strategies +# Day 25 Notes — Git Reset vs Revert & Branching Strategies - Date : 6th - June - 2026 ## ✅ Overview Master **undoing mistakes safely** and understand **branching strategies** used by engineering teams at scale. From 20b0aa640e688fc7b96c142dc2b936d673fd96eb Mon Sep 17 00:00:00 2001 From: dhananjaylavate Date: Wed, 10 Jun 2026 21:32:28 +0100 Subject: [PATCH 35/35] day-24 --- 2026/day-24/day-24-notes.md | 533 ++++++++++++++++++++++++++++++++++++ 1 file changed, 533 insertions(+) create mode 100644 2026/day-24/day-24-notes.md diff --git a/2026/day-24/day-24-notes.md b/2026/day-24/day-24-notes.md new file mode 100644 index 0000000000..152918d8e2 --- /dev/null +++ b/2026/day-24/day-24-notes.md @@ -0,0 +1,533 @@ +# Day 24 Notes — Advanced Git: Merge, Rebase, Stash & Cherry Pick + +## ✅ Overview +Master integrating branches back into `main`, managing work-in-progress, and applying selective commits. These skills separate confident Git practitioners from beginners. + +--- + +## 🔀 Task 1: Git Merge — Combining Branches + +### What is Git Merge? + +`git merge` combines the changes from one branch into another. There are two types: **fast-forward** and **merge commit**. + +--- + +### Type 1: Fast-Forward Merge + +**When it happens:** +- `main` has not moved since the feature branch was created +- Git can simply move `main` pointer to the feature branch's head +- No new commit is created + +**Example:** +```bash +git switch -c feature-login +# (add commits on feature-login) +git switch main +git merge feature-login +# Result: fast-forward merge (no merge commit) +``` + +**History:** +``` +Before: main ●───── feature-login ●─● +After: main ●─●─● +``` + +--- + +### Type 2: Merge Commit + +**When it happens:** +- Both `main` and the feature branch have new commits since they diverged +- Git creates a **new merge commit** that ties both histories together + +**Example:** +```bash +git switch -c feature-signup +# (add commits on feature-signup) +git switch main +# (add a commit on main) +git merge feature-signup +# Result: merge commit created +``` + +**History:** +``` +Before: main ●─● + ╱ + feature-signup ●─● + +After: main ●─●─●─╲ + ╱ ╲ (merge commit) + feature-signup ●─●─╱ +``` + +--- + +### What is a Merge Conflict? + +A merge conflict occurs when **the same lines** in the **same file** are changed differently on both branches. + +**Example:** +```bash +# On main, line 1: "Hello World" +# On feature-fix, line 1: "Hello Universe" +git merge feature-fix +# Conflict! Git cannot auto-merge +``` + +**Git marks the conflict:** +``` +<<<<<<< HEAD +Hello World +======= +Hello Universe +>>>>>>> feature-fix +``` + +**To resolve:** +1. Edit the file and choose which version to keep +2. `git add ` +3. `git commit` to complete the merge + +--- + +### Commands + +```bash +git merge # Merge branch into current branch +git merge --no-ff # Force merge commit (no fast-forward) +git merge --squash # Squash and merge (see Task 3) +git merge --abort # Cancel merge if conflicts exist +``` + +--- + +## 📐 Task 2: Git Rebase — Rewriting History + +### What is Git Rebase? + +`git rebase` moves your commits on top of another branch. It **rewrites history** to create a linear, cleaner commit history. + +--- + +### How Rebase Works + +```bash +git switch -c feature-dashboard +# (add commits A, B, C) +git switch main +# (add commit D) +git switch feature-dashboard +git rebase main +``` + +**Before rebase:** +``` +main ●─●─D + ╱ +feature-dashboard A─B─C +``` + +**After rebase:** +``` +main ●─●─D + ╱ + A'─B'─C' (feature-dashboard) +``` + +Git **replays** commits A, B, C on top of D (creating new commits A', B', C'). + +--- + +### Rebase vs Merge: History Comparison + +**Merge approach:** +```bash +git merge feature-dashboard +``` + +``` +●─●─D─╲ + ╲ (merge commit) +A─B─C─╱ +``` + +**Rebase approach:** +```bash +git rebase main +git switch main && git merge feature-dashboard +``` + +``` +●─●─D─A'─B'─C' +``` + +Rebase creates a **linear** history; merge creates a **branching** history. + +--- + +### ⚠️ Never Rebase Shared Commits + +**Why:** +- Rebase rewrites history +- Others who have the original commits will have diverged history +- Causes conflicts and confusion for the team +- Results in duplicate commits + +**Safe rule:** +```bash +# ✅ Safe: rebase before pushing (local only) +git rebase main +git push -u origin feature-dashboard + +# ❌ Unsafe: rebasing already pushed commits +git push origin feature-dashboard +git rebase main # DON'T DO THIS +git push -f origin feature-dashboard # Force push breaks for teammates +``` + +--- + +### When to Use Rebase vs Merge + +| Scenario | Use | +|---|---| +| Before pushing a feature | ✅ Rebase (clean history) | +| Integrating into shared branch | ✅ Merge (preserves history) | +| Local-only branch cleanup | ✅ Rebase | +| Already pushed to team | ✅ Merge | +| Want linear history | ✅ Rebase | +| Want to preserve all history | ✅ Merge | + +--- + +### Commands + +```bash +git rebase # Rebase current branch onto +git rebase main --interactive # Interactive rebase (edit commits) +git rebase --continue # After resolving conflicts +git rebase --abort # Cancel rebase +``` + +--- + +## 🔄 Task 3: Squash Commits vs Merge Commit + +### What is Squash Merging? + +`git merge --squash` combines all commits from a branch into **one single commit** before merging. + +--- + +### Squash Merge Example + +```bash +git switch -c feature-profile +# Commit 1: Add profile form +# Commit 2: Fix typo in form +# Commit 3: Add profile styling +# Commit 4: Fix mobile responsive + +git switch main +git merge --squash feature-profile +git commit -m "Add user profile feature" +``` + +**Result:** +``` +main ●─●─● (single squashed commit) + └─────┘ (replaces 4 commits) +``` + +--- + +### Regular Merge Example + +```bash +git switch -c feature-settings +# Commit 1: Add settings page +# Commit 2: Add dark mode toggle +# Commit 3: Save user preferences + +git switch main +git merge feature-settings +# (creates merge commit) +``` + +**Result:** +``` +main ●─●─●─╲ + ╲ (merge commit + 3 individual commits visible) +A─B─C───────╱ +``` + +--- + +### Squash vs Regular: Comparison + +| Aspect | Squash | Regular | +|---|---|---| +| **Number of commits** | 1 (squashed) | All commits preserved | +| **History clarity** | Clean, simple | Detailed, shows work | +| **Git log readability** | Better for large features | Better for tracking changes | +| **Blame/git log -p** | Harder to find specific change | Easier to find specific commit | +| **When to use** | Many small commits, feature branch | Shared branches, want full history | + +--- + +### When to Use Each + +- **Squash:** Feature branches with many tiny commits (typos, formatting, iterations) +- **Regular:** Stable branches where you want to see all work done + +--- + +### Commands + +```bash +git merge --squash # Squash merge (stages changes, you commit) +git merge # Regular merge (preserves all commits) +``` + +--- + +## 💾 Task 4: Git Stash — Saving Work-in-Progress + +### What is Git Stash? + +`git stash` temporarily saves uncommitted changes so you can switch branches without losing work. + +--- + +### Stash Workflow + +**Scenario:** +```bash +# You're on feature-A with uncommitted changes +# Urgent: need to switch to main to fix a bug + +# Without stash (Git blocks you): +git switch main +# error: Your local changes to 'file.txt' would be overwritten + +# With stash: +git stash +git switch main +# (do urgent work) +git switch feature-A +git stash pop +# (your changes are back) +``` + +--- + +### Stash vs Commit + +| | Stash | Commit | +|---|---|---| +| **Purpose** | Temporary, cleanup before switching | Permanent record | +| **When to use** | Context switch, work-in-progress | Completed work | +| **History** | Not in git log | Visible in git log | + +--- + +### Stash Commands + +```bash +git stash # Save uncommitted changes +git stash save "message" # Stash with description +git stash list # List all stashes +git stash pop # Apply and remove latest stash +git stash apply # Apply latest stash (keep it) +git stash apply stash@{2} # Apply specific stash +git stash drop # Delete latest stash +git stash drop stash@{1} # Delete specific stash +git stash clear # Delete all stashes +``` + +--- + +### Difference: `pop` vs `apply` + +**`git stash pop`:** +```bash +git stash pop +# Applies the stash AND removes it from the stash list +``` + +**`git stash apply`:** +```bash +git stash apply +# Applies the stash but KEEPS it in the stash list +# Useful if you want to apply to multiple branches +``` + +--- + +### Real-World Workflow Example + +```bash +# Working on feature-A +git add file.txt +# (unstaged changes exist) + +# Urgent bug needs fixing on main +git stash save "WIP: feature-A progress" +git switch main + +# Fix the bug +git add . && git commit -m "Fix urgent bug" +git push + +# Back to feature-A +git switch feature-A +git stash pop +# Continue feature-A work +``` + +--- + +## 🎯 Task 5: Cherry-Pick — Selective Commit Application + +### What is Cherry-Pick? + +`git cherry-pick` applies a **specific commit** from one branch to another, without merging the entire branch. + +--- + +### Cherry-Pick Workflow + +```bash +git switch -c feature-hotfix +# Commit A: Fix login bug +# Commit B: Add logging +# Commit C: Optimize database query + +# Only commit A needs to go to main immediately +git switch main +git cherry-pick +# (only commit A is applied to main) +``` + +**Before:** +``` +main ●─● + ╱ +feature-hotfix A─B─C +``` + +**After:** +``` +main ●─●─A' + ╱ +feature-hotfix A─B─C +``` + +--- + +### Real-World Use Cases + +- 🐛 **Hotfix:** Cherry-pick a bug fix from develop to production +- 📦 **Backport:** Apply a commit to an older release branch +- 🎯 **Selective features:** Apply only specific commits, skip others +- 🔀 **Merge conflicts:** Apply one commit when full merge has conflicts + +--- + +### Cherry-Pick Commands + +```bash +git cherry-pick # Apply specific commit +git cherry-pick # Apply multiple commits +git cherry-pick main..feature-branch # Apply all commits in range +git cherry-pick --continue # After resolving conflicts +git cherry-pick --abort # Cancel cherry-pick +``` + +--- + +### Finding Commit Hash + +```bash +git log --oneline feature-hotfix +# a1b2c3d Fix login bug +# d4e5f6g Add logging +# h7i8j9k Optimize database + +git cherry-pick a1b2c3d +``` + +--- + +### ⚠️ Risks of Cherry-Picking + +- **Duplicate commits:** Same changes applied twice (messy history) +- **Conflicts:** Cherry-picked commit may conflict in the target branch +- **Lost context:** Changes without their related commits may break things +- **Testing:** Changes may not work in isolation + +**Best practice:** Use cherry-pick sparingly, prefer merge when possible. + +--- + +## 🛠️ Complete Command Reference (Days 22–25) + +### Merge & Rebase +```bash +git merge # Merge branch into current +git merge --no-ff # Force merge commit +git merge --squash # Squash merge (combine into 1 commit) +git rebase # Rebase current onto branch +git rebase -i HEAD~3 # Interactive rebase (edit last 3 commits) +``` + +### Stash +```bash +git stash # Save work-in-progress +git stash list # List all stashes +git stash pop # Apply and remove +git stash apply stash@{0} # Apply without removing +git stash drop stash@{1} # Delete specific stash +``` + +### Cherry-Pick +```bash +git cherry-pick # Apply specific commit +git cherry-pick # Apply multiple commits +git cherry-pick --continue # After resolving conflicts +``` + +### Viewing History +```bash +git log --oneline --graph --all # Visual branch history +git log --decorate # Show branch names +git show # Show specific commit details +``` + +--- + +## 🎓 Summary & Key Takeaways + +✅ **Merge:** Combines branches, preserves both histories +✅ **Rebase:** Rewrites history linearly (local only, before push) +✅ **Squash:** Combines multiple commits into one (clean history) +✅ **Stash:** Temporarily saves WIP without committing +✅ **Cherry-Pick:** Applies specific commits selectively +✅ **Conflicts:** Resolve by editing files, then add & commit +✅ **Never rebase shared commits** — use merge instead + +--- + +## 📝 Submission Checklist + +- [ ] Create `day-24-notes.md` (this file) +- [ ] Perform all hands-on tasks in `devops-git-practice` repo +- [ ] Update `git-commands.md` with all commands +- [ ] Commit and push to your fork +- [ ] Share merge vs rebase comparison on LinkedIn + +Happy learning! 🚀